我正在尝试删除整个二叉搜索树(树中的每个节点),您认为其中一个功能会更好吗?
private:
struct Node {
string value;
Node* left;
Node* right;
};
Node* root;
public:
BST() {
root = NULL;
}
~BST() {
delete root->left;
delete root->right;
}
或:
...
void destroyTree (Node*& tree) {
while (tree != NULL) {
tree = tree->left;
delete tree;
}
while (tree != NULL) {
tree = tree->right;
delete tree;
}
delete tree;
}
答案 0 :(得分:0)
建议的析构函数~BST()
和destroyTree()
的建议函数class BST
都不会删除BST实例,并且会比另一个更好。
解释1 - 析构函数~BST()
正在做什么?
建议的来源很简单
delete root->left;
后跟delete root->right;
,只会删除BinarySearchTree的2个节点。
root
未检查为NULL,否则永远不会被删除,root->left
也不用NULL检查,root->right
也不用NULL检查, 解释2 - 函数destroyTree()
正在做什么?
两个while循环尝试探索树,一个用于左侧 分支和一个分支。条件
(tree != NULL)
是 仅出现在退出循环但不检查当前是否存在 节点可以删除。
->left
的{{1}}个节点将被删除,直到root->left
和 CRASH 才会尝试tree->left == NULL
,< / LI>
delete tree;
新的 CRASH 之前添加if (tree==NULL) break;
以退出循环之后,delete tree;
是无意义的,因为在此位置,delete tree;
总是&#39; == NULL`。 奖金解决方案 - 基于功能tree
的修改。
递归函数将是删除所有已创建函数的最简单方法 和插入的节点。但请注意BinarySearchTree的大小 尤其是最深的分支。
destroyTree()