簡體   English   中英

刪除二進制搜索樹的fcn

[英]Remove fcn for Binary Search Tree

二進制搜索樹的此刪除功能看起來正確嗎? 當我嘗試刪除節點時,它會運行並帶回它從中調用的切換菜單,但是當您重新打印樹時實際上並沒有刪除它。 我不確定是否有退貨的地方,可能嗎?

我的問題是:此remove語句實際上是刪除通過的項目,還是只是以殘酷的方式玩弄它而使我頭疼?

void BinarySearchTree::remove(int d)
    {
       //Locate the element
       bool found = false;
       if(isEmpty())
       {
          cout<<" This Tree is empty! "<<endl;
          return;
       }

       tree_node* curr;
       tree_node* parent;
       curr = root;

       while(curr != NULL)
       {
          if(curr->data == d)
          {
             found = true;
             break;
          }
          else
          {
             parent = curr;
             if(d>curr->data) curr = curr->right;
             else curr = curr->left;
          }
        }
        if(!found)
        {
          cout<<" Data not found! "<<endl;
          return;
        }


        // 3 cases :
        // 1. We're removing a leaf node
        // 2. We're removing a node with a single child
        // 3. we're removing a node with 2 children

        // Node with single child
            // Node with single child
if((curr->left == NULL && curr->right != NULL) || (curr->left != NULL && curr->right == NULL))
{
  if(curr->left == NULL && curr->right != NULL)
  {
     if(parent->left == curr)
     {
        parent->left = curr->right;
        delete curr;
     }
     else
     {
        parent->right = curr->right;
        delete curr;
     }
   }
   else // left child present, no right child
   {
     if(parent->left == curr)
     {
        parent->left = curr->left;
        delete curr;
     }
     else
     {
        parent->right = curr->left;
        delete curr;
     }
   }
   return;
}

        //We're looking at a leaf node
        if( curr->left == NULL && curr->right == NULL)
        {
          if(parent->left == curr)
          {
             parent->left = NULL;
          }
          else
          {
             parent->right = NULL;
          }
          delete curr;
          return;
        }


        //Node with 2 children
        // replace node with smallest value in right subtree
        if (curr->left != NULL && curr->right != NULL)
        {
           tree_node* chkr;
           chkr = curr->right;
           if((chkr->left == NULL) && (chkr->right == NULL))
           {
             curr = chkr;
             delete chkr;
             curr->right = NULL;
           }
           else // right child has children
           {
             //if the node's right child has a left child
             // Move all the way down left to locate smallest element

             if((curr->right)->left != NULL)
             {
                tree_node* lcurr;
                tree_node* lcurrp;
                lcurrp = curr->right;
                lcurr = (curr->right)->left;
                while(lcurr->left != NULL)
                {
                   lcurrp = lcurr;
                   lcurr = lcurr->left;
                }
                curr->data = lcurr->data;
                delete lcurr;
                lcurrp->left = NULL;
             }
             else
             {
                tree_node* tmp;
                tmp = curr->right;
                curr->data = tmp->data;
                curr->right = tmp->right;
                delete tmp;
             }

          }
          return;
       }

    }

我讀了您的代碼,並在紙上寫了不同的情況,我認為在這種情況下,該節點有2個孩子,代碼應該是這樣的

 //Node with 2 children
    if (curr->left != NULL && curr->right != NULL)
    {
        tree_node* chkr; 
        if(parent==NULL || parent->left==curr){  //if parent==NULL it means that the node that we want to delete is root
            chkr=curr->right;
            while(chkr->left!=NULL)
                chkr=chkr->left;
            if(parent!=NULL)
                parent->left=curr->right;
            else
                root=curr->right;
            chkr->left=curr->left;
            curr->left=curr->right=NULL;
            delete curr;
        }else if(parent->right==curr){
            chkr=curr->left;
            while(chkr->right!=NULL)
                chkr=chkr->right;
            parent->right=curr->left;
            chkr->right=curr->right;
            curr->left=curr->right=NULL;
            delete curr;
        }
        return;
   }

我沒有對其進行編譯或測試,但我認為它會起作用,請讓我知道

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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