【问题标题】:Delete right node of right subtree of binary search tree (C)删除二叉搜索树右子树的右节点(C)
【发布时间】:2016-12-14 08:53:56
【问题描述】:

我正在开发一个 C 二叉搜索树库,我正在尝试编写一个函数来删除树子树的右节点。这是我的树的结构:

struct Node {
    int value;
    struct Node *left;
    struct Node *right;
};

typedef struct Node TNode;
typedef struct Node *binary_tree;

树是这样创建的:

binary_tree NewBinaryTree(int value_root) {
    binary_tree newRoot = malloc(sizeof(TNode));
    if (newRoot) {
        newRoot->value = value_root;
        newRoot->left = NULL;
        newRoot->right = NULL;
    }
    return newRoot;
}

添加元素:

void Insert(binary_tree *tree, int val) {
    if (*tree == NULL) {
        *tree = (binary_tree)malloc(sizeof(TNode));
        (*tree)->value = val;
        (*tree)->left = NULL;
        (*tree)->right = NULL;
    } else {
        if (val < (*tree)->value) {
            Insert(&(*tree)->left, val);
        } else {
            Insert(&(*tree)->right, val);
        }
    }
}

我写的删除子树右节点的函数是这样的:

void delrightsubtree(binary_tree *tree){


        if( (*tree)->value!=NULL )

        {
                free(&(*tree)->right);
                delrightsubtree( &(*tree)->right);
        }
        else
        {
            printf("end");
        }
    }

但是这个函数似乎不起作用,因为当我调用这个函数时它崩溃了(在树中添加了多个元素之后)。我真的不知道该怎么做。

谢谢!

【问题讨论】:

标签: c tree binary-search-tree


【解决方案1】:

您可能想要实现递归删除方法(就像您的插入方法一样)。现在看起来你在单个节点上调用free,它不会释放它所附加的任何资源(即它的子节点)。相反,请考虑遍历要删除的树部分并将适当的值设置为 NULL。

【讨论】:

  • 我不太清楚。您介意以我的 Insert 方法为例并按照您的意思进行更改吗?谢谢
  • Insert 的想法是正确的:插入一个节点,告诉你的孩子插入它,直到我们到达树的底部。 Delete 也一样:要删除一个分支,告诉你的孩子删除他们的孩子,直到你到达树的底部。
  • 我用我编辑的函数编辑了我的帖子,它确实编译但在我调用函数时崩溃
【解决方案2】:

您只需调用递归删除方法,直到到达终点(没有下一点),然后您只需释放您需要的所有内容并将本应设置为 null 的内容设置为 NULL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多