Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.00 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. class Node{
  6.     private:
  7.         int v;
  8.         Node* left_node;
  9.         Node* right_node;
  10.         Node* parent_node;
  11.     public:
  12.         Node(int v, Node* l, Node* r){ this->v = v; left_node=l; right_node=r; parent_node=NULL;}
  13.         int value()
  14.         {
  15.             return v;
  16.         }
  17.         Node* left()
  18.         {
  19.             return left_node;
  20.         }
  21.         Node* right()
  22.         {
  23.             return right_node;
  24.         }
  25.         Node* parent()
  26.         {
  27.             return parent_node;
  28.         }
  29.         void setValue(int v)
  30.         {
  31.             Node::v = v;
  32.         }
  33.         void setLeft(Node* l)
  34.         {
  35.             left_node = l;
  36.         }
  37.         void setRight(Node* r)
  38.         {
  39.             right_node = r;
  40.         }
  41.         void setParent(Node* p)
  42.         {
  43.             parent_node = p;
  44.         }
  45. };
  46.  
  47. class Tree{
  48.     private:
  49.         Node* root;
  50.  
  51.         bool empty(Node* n)
  52.         {
  53.             if(n == nullptr) return true;
  54.             else return false;
  55.         }   //zwraca prawdê gdy wêze³ nie istnieje
  56.         void preorder(Node* n)
  57.         {
  58.             if(n != nullptr) cout<< n->value() << ", ";
  59.             if(n->left() != nullptr) preorder(n->left());
  60.             if(n->right() != nullptr) preorder(n->right());
  61.         }
  62.         void inorder(Node* n)
  63.         {
  64.             if(n->left() != nullptr) inorder(n->left());
  65.             if(n != nullptr) cout<< n->value() << ", ";
  66.             if(n->right() != nullptr) inorder(n->right());
  67.         }
  68.         void postorder(Node* n)
  69.         {
  70.             if(n->left() != nullptr) postorder(n->left());
  71.             if(n->right() != nullptr) postorder(n->right());
  72.             if(n != nullptr) cout<< n->value() << ", ";
  73.         }
  74.     public:
  75.         Tree()
  76.         {
  77.             root = nullptr;
  78.         }           //tworzy puste drzewo
  79.         Tree(Node* r)
  80.         {
  81.             root = r;
  82.         }
  83.         bool empty()
  84.         {
  85.             if(root == nullptr) return true;
  86.             else return false;
  87.         }       //zwraca prawdê gdy drzewo jest puste
  88.         void preorder()
  89.         {
  90.             preorder(root);
  91.         }
  92.         void inorder()
  93.         {
  94.             inorder(root);
  95.         }
  96.         void postorder()
  97.         {
  98.             postorder(root);
  99.         }
  100.  
  101.  
  102. };
  103.  
  104. class TreeBST
  105. {
  106.         private:
  107.         Node* root;
  108.  
  109.         bool empty(Node* n)
  110.         {
  111.             if(n == nullptr) return true;
  112.             else return false;
  113.         }   //zwraca prawdê gdy wêze³ nie istnieje
  114.  
  115.         void preorder(Node* n)
  116.         {
  117.             if(n != nullptr) cout<< n->value() << ", ";
  118.             if(n->left() != nullptr) preorder(n->left());
  119.             if(n->right() != nullptr) preorder(n->right());
  120.         }
  121.         void inorder(Node* n)
  122.         {
  123.             if(n->left() != nullptr) inorder(n->left());
  124.             if(n != nullptr) cout<< n->value() << ", ";
  125.             if(n->right() != nullptr) inorder(n->right());
  126.         }
  127.         void postorder(Node* n)
  128.         {
  129.             if(n->left() != nullptr) postorder(n->left());
  130.             if(n->right() != nullptr) postorder(n->right());
  131.             if(n != nullptr) cout<< n->value() << ", ";
  132.         }
  133.         Node* minimum(Node* c)
  134.         {
  135.             if(c==nullptr) return nullptr;
  136.             while(c->left() != nullptr) c = c->left();
  137.             return c;
  138.         }
  139.  
  140.         Node* maximum(Node* c)
  141.         {
  142.             if(c==nullptr) return nullptr;
  143.             while(c->right() != nullptr) c = c->right();
  144.             return c;
  145.         }
  146.         public:
  147.         TreeBST()
  148.         {
  149.             root = nullptr;
  150.         }           //tworzy puste drzewo
  151.         TreeBST(Node* r)
  152.         {
  153.             root = r;
  154.         }
  155.         bool empty()
  156.         {
  157.             if(root == nullptr) return true;
  158.             else return false;
  159.         }       //zwraca prawdê gdy drzewo jest puste
  160.         void insert(int x)
  161.         {
  162.             Node * n = new Node(x, nullptr, nullptr);
  163.             Node *p = root;
  164.             Node *s = p;
  165.             if(empty()) root = n;
  166.             else
  167.             {
  168.                 while(p != nullptr)
  169.                 {
  170.                 s = p;
  171.                 if(p->value() > n->value()) p = p->left();
  172.                 else p = p->right();
  173.                 }
  174.                 if(s->value() > n->value()) s->setLeft(n);
  175.                 else s->setRight(n);
  176.             }
  177.             n->setParent(s);
  178.         }
  179.  
  180.         Node* search(int x)
  181.         {
  182.             if(root == nullptr) return nullptr;
  183.             else
  184.             {
  185.                 Node * c = root;
  186.                 while(c != nullptr)
  187.                 {
  188.                 if(c->value() > x) c = c->left();
  189.                 else if(c->value() < x) c = c->right();
  190.                 else return c;
  191.                 }
  192.                 return nullptr;
  193.             }
  194.         }
  195.  
  196.         Node* minimum()
  197.         {
  198.             Node *c = root;
  199.             if(c==nullptr) return nullptr;
  200.             while(c->left() != nullptr) c = c->left();
  201.             return c;
  202.         }
  203.  
  204.         Node* maximum()
  205.         {
  206.             Node *c = root;
  207.             if(c==nullptr) return nullptr;
  208.             while(c->right() != nullptr) c = c->right();
  209.             return c;
  210.         }
  211.  
  212.         Node* prec(Node* p)
  213.         {
  214.             if(p->left() != nullptr) maximum(p->left());
  215.             else
  216.             {
  217.                 while(p->parent() != nullptr)
  218.                 {
  219.                 if(p->parent()->left() == p) p = p->parent();
  220.                 else return p->parent();
  221.                 }
  222.             }
  223.         }
  224.  
  225.         Node* succ(Node* p)
  226.         {
  227.             if(p->right() != nullptr) minimum(p->right());
  228.             else
  229.             {
  230.                 while(p->parent() != nullptr)
  231.                 {
  232.                 if(p->parent()->right() == p) p = p->parent();
  233.                 else return p->parent();
  234.                 }
  235.             }
  236.         }
  237.  
  238.         void del(Node* p)
  239.         {
  240.             if((p->left() == nullptr)&&(p->right()==nullptr))
  241.             {
  242.             if(p->parent()->left() == p) p->parent()->setLeft(nullptr);
  243.             if(p->parent()->right() == p) p->parent()->setRight(nullptr);
  244.             delete p;
  245.             }
  246.             else if(p->left() == nullptr)
  247.             {
  248.                 Node *o = p;
  249.                 p = p->right();
  250.                 p->setParent(o->parent());
  251.                 delete o;
  252.             }
  253.             else if(p->right() == nullptr)
  254.             {
  255.                 Node *o = p;
  256.                 p = p->left();
  257.                 p->setParent(o->parent());
  258.                 delete o;
  259.             }
  260.         }
  261.  
  262.         void preorder()
  263.         {
  264.             preorder(root);
  265.         }
  266.         void inorder()
  267.         {
  268.             inorder(root);
  269.         }
  270.         void postorder()
  271.         {
  272.             postorder(root);
  273.         }
  274.  
  275. };
  276.  
  277. /*
  278. przyk³adowe drzewo do testów (bez ustawienia ojca):
  279.     Tree* t=new Tree(new Node(9, new Node(5, new Node(2, new Node(3, NULL, NULL), new Node(3, NULL, NULL)),
  280.     new Node(7, NULL, new Node(8,NULL, NULL))), new Node(12, new Node(10, NULL, new Node(11, NULL, NULL)), NULL)));
  281.  
  282. */
  283.  
  284. int main()
  285. {
  286.     TreeBST* t = new TreeBST();
  287.     t->insert(12);
  288.     cout << "\nPreorder: ";
  289.     t->preorder();
  290.     t->insert(7);
  291.     cout << "\nPreorder: ";
  292.     t->preorder();
  293.     t->insert(9);
  294.     cout << "\nPreorder: ";
  295.     t->preorder();
  296.     t->insert(3);
  297.     cout << "\nPreorder: ";
  298.     t->preorder();
  299.     t->insert(19);
  300.     cout << "\nPreorder: ";
  301.     t->preorder();
  302.     t->insert(15);
  303.     cout << "\nPreorder: ";
  304.     t->preorder();
  305.     t->insert(14);
  306.     cout << "\nPreorder: ";
  307.     t->preorder();
  308.     cout << endl;
  309.     t->del(t->search(15));
  310.     cout << "\nPreorder: ";
  311.     t->preorder();
  312.  
  313. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement