我正在创建一个二叉搜索树,它有一个删除树中所有节点的函数。当稍后调用时,似乎所有节点都被删除,但根节点。在将条件添加到下面的代码之前,还有其他节点没有被删除。这个问题现在已经解决了,但是根节点不会被删除。想知道应该添加什么条件,或者是否有什么我不理解的根删除。
我尝试了一个更简单的解决方案,其中没有使用条件。程序运行正常,但在最后再次调用遍历后,似乎并不是所有内容都被删除了。
TreeNodePtr deleteTree(TreeNodePtr node)
{
if(node -> left)
{
deleteTree(node -> left);
printf("Deleting node %s \n", node -> left -> data.word);
free(node -> left);
node -> left = NULL;
}
if(node -> right)
{
deleteTree(node -> right);
printf("Deleting node %s \n", node -> right -> data.word);
free(node -> right);
node -> right = NULL;
}
if(allocation_count == 1)
{
printf("Deleting node %s \n", node -> data.word);
free(node);
node = NULL;
}
//whenever a node is deleted this decreases by one, when at one
//attempt to delete root node
allocation_count--;
return node;
}
所有的删除示例都被打印出来了,但是根并没有从树中被删除。在删除过程之后调用遍历时,会保留一个节点值并打印出来。
2条答案
按热度按时间gopyfrb31#
你展示的代码是不必要的复杂,隐藏着微妙的问题。
无论如何,它不能修改传递的参数,因为在C中所有参数都是通过值传递的。
考虑到你返回了一个
TreeNode*
,调用者可能负责将它分配给根指针。此外,除非你最多只有一棵树,否则为每棵树使用像
allocationCount
这样的全局属性是一个错误。最后,如果你的树是空的呢?
简化的固定代码:
nxowjjhe2#
你的算法会立即开始删除左子树和右子树,但不会删除根节点。
记住树是递归结构,每个子树都有自己的根节点。因此,您应该删除
node
,然后 * 递归地调用左右子树上的deleteTree
。这个 * 应该 * 工作: