我写了一个函数来取消BST的所有叶子。 BST当然有一个左右指针和一个名为data的char来存储节点的值。
void removeLeaves(struct Tree* T){
if(T->left == NULL && T->right == NULL){
printf("removing %c\n", T->data);
T=NULL;
}
else{
if(T->left!=NULL){
removeLeaves(T->left);
}
if(T->right!=NULL){
removeLeaves(T->right);
}
}
}
我在调用此函数之前和之后打印树。 虽然上面的print语句可以工作并打印出无效的节点,但结果树是相同的。 我有类似的东西:
print(BST);
removeLeaves(BST);
print(BST);
知道发生了什么事吗? 感谢。
答案 0 :(得分:1)
您正在通过值传递T,因此将T设置为null不会执行任何操作(T只是指针的本地副本)。
您需要某种方式将T的“所有者”(即父级 - >左侧或父级 - >右侧)设置为空。
(同样通过将T设置为null可能会导致内存泄漏 - 您是否需要释放()?)
答案 1 :(得分:1)
T=NULL;
将null赋给本地指针,而不是树中的任何内容。您需要使用struct Tree **
,以便修改struct Tree *
:
void removeLeaves(struct Tree ** T){
if((*T)->left == NULL && (*T)->right == NULL){
printf("removing %c\n", (*T)->data);
*T = NULL;
}
else{
if((*T)->left!=NULL){
pruneTree((*T)->left);
}
if((*T)->right!=NULL){
pruneTree((*T)->right);
}
}
}
答案 2 :(得分:0)
您拥有所需的部件。这主要是重新排序它们。
void removeLeaves(struct Tree* const T){
if(T->left!=NULL){
removeLeaves(T->left);
T->left = NULL;
}
if(T->right!=NULL){
removeLeaves(T->right);
T->right = NULL;
}
}
但请注意const
。你的代码可以在没有它的情况下工作,但它不应该,因为设置T = NULL
实际上并没有做任何事情,尽管可能会有这样的事情。
更新: @ PaulP.R.O。答案很有意思,顺带一提。我更喜欢我的,但你可以尝试两种,看看哪种套装。
顺便说一句,请确保您不需要在某处调用free()
,以防止内存泄漏。