Advertisement
OLLI_BS

binary_tree

Feb 13th, 2017
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.78 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.IO;
  7.  
  8. namespace task1
  9. {
  10.     public class BinaryTree //класс, реализующий АТД «дерево бинарного поиска»
  11.     {
  12.         private class Node //вложенный класс, отвечающий за узлы и операции допустимы для дерева бинарного поиска
  13.         {
  14.             public object inf;//информационное поле public
  15.             Node left;//ссылка на левое поддерево
  16.             Node right;//ссылка на правое поддерево
  17.  
  18.             //конструктор вложенного класса, создает узел дерева
  19.             public Node(object nodeInf)
  20.             {
  21.                 inf = nodeInf;
  22.                 left = null;
  23.                 right = null;
  24.             }
  25.  
  26.             public static void Add(ref Node r, object nodeInf) //добавляет узел в дерево так, чтобы дерево оставалось деревом бинарного поиска
  27.             {
  28.                 if (r == null)
  29.                 {
  30.                     r = new Node(nodeInf);
  31.                 }
  32.                 else
  33.                 {
  34.                     if (((IComparable)(r.inf)).CompareTo(nodeInf) > 0)
  35.                     {
  36.                         Add(ref r.left, nodeInf);
  37.                     }
  38.                     else
  39.                     {
  40.                         Add(ref r.right, nodeInf);
  41.                     }
  42.                 }
  43.             }
  44.  
  45.             public static void Preorder(Node r) //прямой обход дерева
  46.             {
  47.                 if (r != null)
  48.                 {
  49.                     Console.Write("{0} ", r.inf);
  50.                     Preorder(r.left);
  51.                     Preorder(r.right);
  52.                 }
  53.             }
  54.  
  55.             public static void Inorder(Node r) //симметричный обход дерева
  56.             {
  57.                 if (r != null)
  58.                 {
  59.                     Inorder(r.left);
  60.                     Console.Write("{0} ", r.inf);
  61.                     Inorder(r.right);
  62.                 }
  63.             }
  64.  
  65.             public static void Postorder(Node r) //обратный обход дерева
  66.             {
  67.                 if (r != null)
  68.                 {
  69.                     Postorder(r.left);
  70.                     Postorder(r.right);
  71.                     Console.Write("{0} ", r.inf);
  72.                 }
  73.             }
  74.  
  75.             public static void Search(Node r, object key, out Node item) //поиск ключевого узла в дереве
  76.             {
  77.                 if (r == null)
  78.                 {
  79.                     item = null;
  80.                 }
  81.                 else
  82.                 {
  83.                     if (((IComparable)(r.inf)).CompareTo(key) == 0)
  84.                     {
  85.                         item = r;
  86.                     }
  87.                     else
  88.                     {
  89.                         if (((IComparable)(r.inf)).CompareTo(key) > 0)
  90.                         {
  91.                             Search(r.left, key, out item);
  92.                         }
  93.                         else
  94.                         {
  95.                             Search(r.right, key, out item);
  96.                         }
  97.                     }
  98.                 }
  99.             }
  100.  
  101.             //методы Del и Delete позволяют удалить узел в дереве так, чтобы дерево при этом
  102.             //оставалось деревом бинарного поиска
  103.             private static void Del(Node t, ref Node tr)
  104.             {
  105.                 if (tr.right != null)
  106.                 {
  107.                     Del(t, ref tr.right);
  108.                 }
  109.                 else
  110.                 {
  111.                     t.inf = tr.inf;
  112.                     tr = tr.left;
  113.                 }
  114.             }
  115.  
  116.             public static void Delete(ref Node t, object key)
  117.             {
  118.                 if (t == null)
  119.                 {
  120.                     throw new Exception("Данное значение в дереве отсутствует");
  121.                 }
  122.                 else
  123.                 {
  124.                     if (((IComparable)(t.inf)).CompareTo(key) > 0)
  125.                     {
  126.                         Delete(ref t.left, key);
  127.                     }
  128.                     else
  129.                     {
  130.                         if (((IComparable)(t.inf)).CompareTo(key) < 0)
  131.                         {
  132.                             Delete(ref t.right, key);
  133.                         }
  134.                         else
  135.                         {
  136.                             if (t.left == null)
  137.                             {
  138.                                 t = t.right;
  139.                             }
  140.                             else
  141.                             {
  142.                                 if (t.right == null)
  143.                                 {
  144.                                     t = t.left;
  145.                                 }
  146.                                 else
  147.                                 {
  148.                                     Del(t, ref t.left);
  149.                                 }
  150.                             }
  151.                         }
  152.                     }
  153.                 }
  154.             }
  155.         }
  156.  
  157.         Node tree; //ссылка на корень дерева
  158.  
  159.         public object Inf //свойство позволяет получить доступ к значению информационного поля корня дерева
  160.         {
  161.             set { tree.inf = value; }
  162.             get { return tree.inf; }
  163.         }
  164.  
  165.         public BinaryTree() //открытый конструктор
  166.         {
  167.             tree = null;
  168.         }
  169.  
  170.         private BinaryTree(Node r) //закрытый конструктор
  171.         {
  172.             tree = r;
  173.         }
  174.  
  175.         public void Add(object nodeInf) //добавление узла в дерево
  176.         {
  177.             Node.Add(ref tree, nodeInf); //при этом местоположение нового узла определяется
  178.         }
  179.  
  180.         public void Preorder() //организация различных способов обхода дерева
  181.         {
  182.             Node.Preorder(tree);
  183.         }
  184.  
  185.         public void Inorder()
  186.         {
  187.             Node.Inorder(tree);
  188.         }
  189.  
  190.         public void Postorder()
  191.         {
  192.             Node.Postorder(tree);
  193.         }
  194.  
  195.         public BinaryTree Search(object key) //поиск ключевого узла в дереве
  196.         {
  197.             Node r;
  198.             Node.Search(tree, key, out r);
  199.             BinaryTree t = new BinaryTree(r);
  200.             return t;
  201.         }
  202.  
  203.         public void Delete(object key) //удаление ключевого узла в дереве
  204.         {
  205.             Node.Delete(ref tree, key);
  206.         }
  207.     }
  208.  
  209.     class Programm
  210.     {
  211.         static void Main(string[] args)
  212.         {
  213.             int n = int.Parse(Console.ReadLine());
  214.             int[] mass = new int[n];
  215.  
  216.             using (StreamReader file = new StreamReader("../../input.txt"))
  217.             {
  218.                 string[] values = file.ReadLine().Split(' ');
  219.                 int counter = 0;
  220.                 foreach (string elem in values)
  221.                 {
  222.                     mass[counter] = int.Parse(elem);
  223.                     counter++;
  224.                 }
  225.             }
  226.  
  227.             BinaryTree tree = new BinaryTree();
  228.             foreach (int item in mass)
  229.             {
  230.                 tree.Add(item);
  231.             }
  232.  
  233.             Console.ReadKey();
  234.         }
  235.     }
  236. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement