Advertisement
Guest User

Untitled

a guest
Oct 20th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.26 KB | None | 0 0
  1. / Bintree.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <cstdlib>
  6. #include <iostream>
  7. #include <algorithm>
  8.  
  9. struct Node
  10. {
  11.     int contain; //содержимое узла
  12.     Node *left; //указатель на левого потомка
  13.     Node *right; //указатель на правого потомка
  14.     Node *parent;  //указатель на предка
  15. };
  16.  
  17. void tree_print_simple(Node *node, int level)
  18. {
  19.     for (int i = 0; i < level; i++)
  20.         std::cout << "  ";
  21.     if (!node)
  22.     {
  23.         std::cout << "-\n";
  24.         return;
  25.     }
  26.     std::cout << node->contain << '\n';
  27.     if (node->left || node->right)
  28.     {
  29.         tree_print_simple(node->left, level+1);
  30.         tree_print_simple(node->right, level+1);
  31.     }
  32. }
  33.  
  34. Node *key_search(int key_s, Node *origin)
  35. {
  36.     Node *node = origin;
  37.     while (node)
  38.     {
  39.         if (node->contain == key_s)
  40.             return node;
  41.         if (node->contain > key_s)
  42.             node = node->left;
  43.         else
  44.             node = node->right;
  45.     }
  46.     return 0;
  47. }
  48.  
  49. void key_add(int key_a, Node *origin)
  50. {
  51.  
  52.     Node *node = new Node;
  53.     node->contain = key_a;
  54.     node->left = NULL;
  55.     node->right = NULL;
  56.     Node **a = &origin, *b = 0;
  57.     while (*a)
  58.     {
  59.         b = *a;
  60.         if (node->contain < (*a)->contain)
  61.             a = &(*a)->left;
  62.         else
  63.             a = &(*a)->right;
  64.     }
  65.         *a = node;
  66.         node->parent = b;
  67. }
  68.  
  69. int min_key(Node *origin)
  70. {
  71.     Node *node = origin;
  72.     if (!node)
  73.         return -1;
  74.     while (node->left)
  75.         node = node->left;
  76.     return node->contain;
  77. }
  78.  
  79. void key_delete(int key_d, Node *origin)
  80. {
  81.     Node *node = origin;
  82.     while (node)
  83.     {
  84.         if (node->contain == key_d)
  85.         {
  86.             Node *ptr;
  87.             if (node->left == 0)
  88.                 ptr = node->right;
  89.             else
  90.                 ptr = node->left;
  91.             if (node == (node->parent)->left)
  92.                 node->parent->left = ptr;
  93.             else
  94.                 node->parent->right = ptr;
  95.             ptr->parent = node->parent;
  96.             delete node;
  97.             return;
  98.         }
  99.         if (node->contain > key_d)
  100.             node = node->left;
  101.         else
  102.             node = node->right;
  103.     }
  104. }
  105.  
  106. void traverse(Node *node)
  107. {
  108.     if (!node) return;
  109.     std::cout << node->contain << ' ';
  110.     traverse(node->left);
  111.     traverse(node->right);
  112. }
  113.  
  114. int main()
  115. {
  116.     int key_s, key_a, key_d;
  117.     std::cout << "Enter keys for binary tree: ";
  118.     Node *origin = 0;
  119.     for (int i = 0; i < 25; i++)
  120.     {
  121.         Node *node = new Node;
  122.         std::cin >> node->contain;
  123.         node->left = 0;
  124.         node->right = 0;
  125.  
  126.         Node **a = &origin, *b = 0;
  127.         while (*a)
  128.         {
  129.             b = *a;
  130.             if (node->contain < (*a)->contain)
  131.                 a = &(*a)->left;
  132.             else
  133.                 a = &(*a)->right;
  134.         }
  135.         *a = node;
  136.         node->parent = b;
  137.     }
  138.    
  139.     tree_print_simple(origin, 0);
  140.  
  141.     std::cout << "Enter needed key: ";
  142.     std::cin >> key_s;
  143.         Node *p = key_search(key_s, origin);
  144.         if (p)
  145.             std::cout << "Needed key is found! \n";
  146.         else
  147.             std::cout << "Sorry, no such key! \n";
  148.  
  149.     std::cout << "Enter the key, which you want to add: ";
  150.     std::cin >> key_a;
  151.  
  152.     key_add(key_a, origin);
  153.  
  154.     tree_print_simple(origin, 0);
  155.  
  156.     if (min_key(origin))
  157.         std::cout << "Minimal key is " << min_key(origin)<<'\n';
  158.     else
  159.         std::cout << "Didn't manage to find minimal key!\n";
  160.  
  161.     std::cout << "Enter the key, which you want to delete: ";
  162.     std::cin >> key_d;
  163.    
  164.     key_delete(key_d, origin);
  165.  
  166.     tree_print_simple(origin, 0);
  167.  
  168.     traverse(origin);
  169.  
  170.     std::cout << "\n";
  171.     system("pause");
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement