C语言 如何删除根节点作为完整树删除的一部分

lzfw57am  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(100)

我正在创建一个二叉搜索树,它有一个删除树中所有节点的函数。当稍后调用时,似乎所有节点都被删除,但根节点。在将条件添加到下面的代码之前,还有其他节点没有被删除。这个问题现在已经解决了,但是根节点不会被删除。想知道应该添加什么条件,或者是否有什么我不理解的根删除。
我尝试了一个更简单的解决方案,其中没有使用条件。程序运行正常,但在最后再次调用遍历后,似乎并不是所有内容都被删除了。

  1. TreeNodePtr deleteTree(TreeNodePtr node)
  2. {
  3. if(node -> left)
  4. {
  5. deleteTree(node -> left);
  6. printf("Deleting node %s \n", node -> left -> data.word);
  7. free(node -> left);
  8. node -> left = NULL;
  9. }
  10. if(node -> right)
  11. {
  12. deleteTree(node -> right);
  13. printf("Deleting node %s \n", node -> right -> data.word);
  14. free(node -> right);
  15. node -> right = NULL;
  16. }
  17. if(allocation_count == 1)
  18. {
  19. printf("Deleting node %s \n", node -> data.word);
  20. free(node);
  21. node = NULL;
  22. }
  23. //whenever a node is deleted this decreases by one, when at one
  24. //attempt to delete root node
  25. allocation_count--;
  26. return node;

}
所有的删除示例都被打印出来了,但是根并没有从树中被删除。在删除过程之后调用遍历时,会保留一个节点值并打印出来。

gopyfrb3

gopyfrb31#

你展示的代码是不必要的复杂,隐藏着微妙的问题。
无论如何,它不能修改传递的参数,因为在C中所有参数都是通过值传递的。
考虑到你返回了一个TreeNode*,调用者可能负责将它分配给根指针。
此外,除非你最多只有一棵树,否则为每棵树使用像allocationCount这样的全局属性是一个错误。
最后,如果你的树是空的呢?
简化的固定代码:

  1. TreeNode* deleteTree(TreeNode* node) {
  2. if (!node)
  3. return 0;
  4. deleteTree(node->left);
  5. deleteTree(node->right);
  6. printf("Deleting node %s\n", node->data.word);
  7. free(node);
  8. --allocationCount; // Whatever for. Statistics maybe?
  9. return 0;
  10. }
展开查看全部
nxowjjhe

nxowjjhe2#

你的算法会立即开始删除左子树和右子树,但不会删除根节点。
记住树是递归结构,每个子树都有自己的根节点。因此,您应该删除node,然后 * 递归地调用左右子树上的deleteTree
这个 * 应该 * 工作:

  1. void deleteTree(TreeNodePtr node)
  2. {
  3. if(node -> left)
  4. {
  5. deleteTree(node -> left);
  6. node -> left = NULL;
  7. }
  8. if(node -> right)
  9. {
  10. deleteTree(node -> right);
  11. node -> right = NULL;
  12. }
  13. free(node);
  14. }
展开查看全部

相关问题