Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.07 KB | None | 0 0
  1. void TreeBST::del(Node* p) {
  2.     if (empty()) {
  3.         cout << "Drzewo puste" << endl;
  4.         return;
  5.     }
  6.  
  7.     if (empty(p->left()) && empty(p->right())) {
  8.         if (p == root) {
  9.             delete p;
  10.             root = NULL;
  11.             return;
  12.         }
  13.        
  14.         if (p->parent()->left() == p) {
  15.             p->parent()->setLeft(NULL);
  16.             delete p;
  17.             return;
  18.         }
  19.         else {
  20.             p->parent()->setRight(NULL);
  21.             delete p;
  22.             return;
  23.         }
  24.     }
  25.     else if (!empty(p->left()) && empty(p->right())) {
  26.         if (p == root) {
  27.             root = p->left();
  28.             delete p;
  29.             return;
  30.         }
  31.  
  32.         if (p->parent()->left() == p) {
  33.             p->parent()->setLeft(p->left());
  34.             p->left()->setParent(p->parent());
  35.             delete p;
  36.             return;
  37.         }
  38.         else {
  39.             p->parent()->setRight(p->left());
  40.             p->left()->setParent(p->parent());
  41.             delete p;
  42.             return;
  43.         }
  44.    
  45.     }
  46.     else if (!empty(p->right()) && empty(p->left())) {
  47.         if (p == root) {
  48.             root = p->right();
  49.             delete p;
  50.             return;
  51.         }
  52.  
  53.         if (p->parent()->left() == p) {
  54.             p->parent()->setLeft(p->right());
  55.             p->right()->setParent(p->parent());
  56.             delete p;
  57.             return;
  58.         }
  59.         else {
  60.             p->parent()->setRight(p->right());
  61.             p->right()->setParent(p->parent());
  62.             delete p;
  63.             return;
  64.         }
  65.     }
  66.     else {
  67.         Node* succNode = succ(p);
  68.  
  69.         if (p->right() != succNode) {
  70.             p->right()->setParent(succNode);
  71.         }
  72.            
  73.         if (succNode->parent() != p) {
  74.             if (succNode->parent()->left() == succNode) {
  75.                 if (!empty(succNode->left())) {
  76.                     succNode->parent()->setLeft(succNode->left());
  77.                 }
  78.                 else {
  79.                     succNode->parent()->setLeft(succNode->right());
  80.                 }
  81.             }
  82.             else {
  83.                 if (!empty(succNode->right())) {
  84.                     succNode->parent()->setRight(succNode->left());
  85.                 }
  86.                 else {
  87.                     succNode->parent()->setRight(succNode->right());
  88.                 }
  89.             }
  90.         }
  91.         if (p != root) {
  92.             if (p->parent()->left() == p) {
  93.                 p->parent()->setLeft(succNode);
  94.             }
  95.             else {
  96.                 p->parent()->setRight(succNode);
  97.             }
  98.         }
  99.         else {
  100.             root = succNode;
  101.         }
  102.         succNode->setLeft(p->left());
  103.         if (p->right() != succNode)
  104.             succNode->setRight(p->right());
  105.         succNode->setParent(NULL);
  106.  
  107.         delete p;
  108.         return;
  109.     }
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement