我在C ++中实现了二进制搜索树。
对于delete方法,除了最后一种情况外,一切都有效,当唯一的树是父树时,它指向两个空子节点。
现在的问题是:
我希望在删除子树后打印出与父级相同的左右子树。他们和父母都应该是NULL
但是当我尝试输出这些值时,我得到STATUS_ACCESS _VIOLATION
。
以下是有问题的删除代码。
我希望删除父节点,并设置tree->left = tree->right = NULL.
void BST_delete(string key, BST & tree) {
if ((!BST_has(key, tree) || BST_isEmpty(tree))) {
return;
} else if (tree->key == key) {
if (tree->right == NULL && tree->left == NULL) {
tree = NULL; // <-- THIS IS IN QUESTION
} else if (tree->left == NULL) {
...
} ....
}
MAIN:
int main() {
BST bst;
BST_init(bst);
BST_insert("a",bst);
BST_print(bst);
cout << endl;
BST_delete("a",bst);
BST_print(bst); // <-- doesnt print anything (which is right)
cout << bst->right; //<-- Gives me error
return 0;
}
答案 0 :(得分:0)
您可以检查NULL(或nullptr):
voit printNode(BSTNode* p) {
cout << ( p==NULL ? "null" : *p);
}
if (bst != NULL) {
cout << printNode(bst->right);
cout << printNode(bst->left);
}
并将此检查添加到BST_print函数。
答案 1 :(得分:0)
这就是发生的事情:
BST_delete("a",bst);
// bst is NULL
BST_print(bst); // equivalent to BST_print(NULL)
cout << bst->right; // Gives an error, because you
// can't access a member on a pointer that is NULL
最后一行就像说NULL->right
,这没有意义。
我不确定该告诉您如何修复它 - 正如评论者指出的那样,为什么在删除bst->right
后仍然想要致电bst
?也许最好删除该行,或者执行:
if (bst != NULL) cout << bst->right