我正在研究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");
}
}
但是这个函数似乎不起作用,因为当我调用这个函数时它会崩溃(在向树中添加多个元素之后)。我真的不知道该怎么做。
谢谢!
答案 0 :(得分:1)
您可能希望实现递归删除方法(就像插入方法一样)。现在看起来你在一个节点上调用free
,它不会释放它附加的任何资源(即它的子节点)。相反,请考虑遍历要删除的树部分并将适当的值设置为NULL。
答案 1 :(得分:0)
你只需调用递归删除方法直到你到达目的地(没有下一个点),然后你就可以释放你需要的所有内容并设置为假设设置为null的NULL。