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

时间:2016-12-13 01:19:58

标签: 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");
        }
    }

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

谢谢!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

你只需调用递归删除方法直到你到达目的地(没有下一个点),然后你就可以释放你需要的所有内容并设置为假设设置为null的NULL。