c - 删除二叉搜索树右子树的右节点(C)

标签 c tree binary-search-tree

我正在开发一个 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");
        }
    }

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

谢谢!

最佳答案

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

关于c - 删除二叉搜索树右子树的右节点(C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41112309/

相关文章:

c - program.exe 编译后停止工作?

构造随机 "integer"树 - 深度优先/广度优先

c - C 中二叉树最小堆实现的各种问题

Javascript:按顺序遍历递归混淆的二叉搜索树

c - 将 char 数组从 c 中的 scanf 传递给函数

c - C 中字符串的一些问题

是否可以使用本地端口通过 UDP 连接到多个远程对等点?

c# - 如何执行递归搜索?

algorithm - 找到具有 k 个蓝色顶点的树的最佳顶点覆盖

c - 使用 fgets 将文件中的行读入二进制搜索树