Advertisement
Auios

Untitled

Nov 25th, 2018
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.86 KB | None | 0 0
  1. void remove(const T& data)
  2.     {
  3.         if (root_ == nullptr) return;
  4.  
  5.         bool found = false;
  6.         Node* curr = root_;
  7.         Node* parent = nullptr;
  8.  
  9.         while (curr != nullptr)
  10.         {
  11.             if (curr->data_ == data)
  12.             {
  13.                 found = true;
  14.                 break;
  15.             }
  16.             else
  17.             {
  18.                 parent = curr;
  19.                 if (data > curr->data_) curr = curr->right_;
  20.                 else curr = curr->left_;
  21.             }
  22.         }
  23.  
  24.         if (!found) return;
  25.  
  26.         if ((curr->left_ == nullptr && curr->right_ != nullptr) || (curr->left_ != nullptr && curr->right_ == nullptr))
  27.         {
  28.             if (curr->left_ == nullptr && curr->right_ != nullptr)
  29.             {
  30.                 if (parent->left_ == curr)
  31.                     parent->left_ = curr->right_;
  32.                 else
  33.                     parent->right_ = curr->right_;
  34.                 delete curr;
  35.             }
  36.             else
  37.             {
  38.                 if (parent->left_ == curr)
  39.                     parent->left_ = curr->left_;
  40.                 else
  41.                     parent->right_ = curr->left_;
  42.                 delete curr;
  43.             }
  44.             return;
  45.         }
  46.  
  47.         if (curr->left_ == nullptr && curr->right_ == nullptr)
  48.         {
  49.             if (parent == nullptr)
  50.                 delete curr;
  51.             else
  52.             {
  53.                 if (parent->left_ == curr) parent->left_ = nullptr;
  54.                 else parent->right_ = nullptr;
  55.                 delete curr;
  56.             }
  57.             return;
  58.         }
  59.  
  60.         if (curr->left_ != nullptr && curr->right_ != nullptr)
  61.         {
  62.             Node* chkr = curr->right_;
  63.             if ((chkr->left_ == nullptr) && (chkr->right_ == nullptr))
  64.             {
  65.                 curr = chkr;
  66.                 delete chkr;
  67.                 curr->right_ = nullptr;
  68.             }
  69.             else
  70.             {
  71.                 if ((curr->right_)->left_ != nullptr)
  72.                 {
  73.                     Node* lcurr = curr->right_;
  74.                     Node* lcurrp = (curr->right_)->left_;
  75.  
  76.                     while (lcurr->left_ != nullptr)
  77.                     {
  78.                         lcurrp = lcurr;
  79.                         lcurr = lcurr->left_;
  80.                     }
  81.  
  82.                     curr->data_ = lcurr->data_;
  83.                     delete lcurr;
  84.                     lcurrp->left_ = nullptr;
  85.                 }
  86.                 else
  87.                 {
  88.                     Node* tmp;
  89.                     tmp = curr->right_;
  90.                     curr->data_ = tmp->data_;
  91.                     curr->right_ = tmp->right_;
  92.                     delete tmp;
  93.                 }
  94.             }
  95.             return;
  96.         }
  97.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement