[英]Problem Deleting Node of a Binary Search Tree
我正在用C++實現一個二叉搜索樹,但是代碼有錯誤,當刪除一個有2個孩子的節點時,結果樹沒有很好地連接,刪除一個有0個或1個孩子的節點的方法效果很好。 此代碼基於此答案: https : //stackoverflow.com/a/31698320/11053027 。
編輯:例如,如果按以下順序添加值:17、12、25,然后我嘗試刪除作為根的 17,它將被刪除,因此當我嘗試顯示所有元素時:12、25、 25 作為根。 但是如果現在我嘗試刪除 12 它沒有被刪除,問題是在我第一次刪除 17 時引起的。沒有顯示錯誤消息。
你能幫我嗎。 提前致謝。 這是代碼:
Node<E> *getSuccesor(Node<E> &node) const {
auto *Succesor = node.right;
while (Succesor != nullptr) {
if (Succesor->left == nullptr) return Succesor;
Succesor = Succesor->left;
}
return Succesor;
}
void remove(Node<E> &node) {
if (&node == nullptr) return;
int nChildren = numChildren(node);
Node<E> *child;
if (nChildren == 2) {
child = getSuccesor(node);
remove(*child);
child->parent = node.parent;
child->left = node.left;
child->right = node.right;
if (&node == root)
root = child;
else {
if (&node == node.parent->right)
node.parent->right = child;
else node.parent->left = child;
}
} else {
child = (node.left != nullptr ? node.left : node.right);
if (child != nullptr)
child->parent = node.parent;
if (&node == root)
root = child;
else {
if (&node == node.parent->left)
node.parent->left = child;
else node.parent->right = child;
}
}
Size--;
}
很難確定,因為你沒有給我們一個最小的完整例子,但我認為問題出在這里:
if (nChildren == 2) {
child = getSuccesor(node);
remove(*child);
child->parent = node.parent;
child->left = node.left;
child->right = node.right;
所以現在child
知道它的孩子。 但是他們不知道那個child
現在是他們的父母。 它們的parent
指針仍然指向已失效的節點(在本例中為“17”),這會在下一次刪除時弄亂邏輯。
在這些行之后,添加這些:
if(child->left)
child->left->parent = child;
if(child->right)
child->right->parent = child;
編輯:同樣的錯誤也在 if-else 條件的另一個分支中,但我相信你也可以在那里看到如何修復它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.