簡體   English   中英

二叉搜索樹節點刪除問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM