Advertisement
Sephinroth

21.2

Apr 20th, 2020
377
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.51 KB | None | 0 0
  1. using System;
  2. using System.IO;
  3. namespace practice
  4. {
  5.     public class BinaryTree
  6.     {
  7.         private class Node
  8.         {
  9.             public int inf;  
  10.             public Node left;
  11.             public Node right;
  12.             public Node(int nodeInf)
  13.             {
  14.                 inf = nodeInf;
  15.                 left = null;
  16.                 right = null;
  17.             }
  18.             public static void Add(ref Node r, int nodeInf)
  19.             {
  20.                 if (r==null)
  21.                 {
  22.                     r=new Node (nodeInf);
  23.                 }
  24.                 else
  25.                 {
  26.                     if (((IComparable)(r.inf)).CompareTo(nodeInf) > 0)
  27.                     {
  28.                         Add(ref r.left, nodeInf);
  29.                     }
  30.                     else
  31.                     {
  32.                         Add(ref r.right, nodeInf);
  33.                     }
  34.                 }
  35.             }
  36.             public static void Preorder (Node r)
  37.             {
  38.                 if (r!=null)
  39.                 {
  40.                     Console.Write("{0} ",r.inf);
  41.                     Preorder(r.left);
  42.                     Preorder(r.right);
  43.                 }
  44.             }
  45.             public static void Inorder (Node r)
  46.             {
  47.                 if (r!=null)
  48.                 {
  49.                     Inorder(r.left);
  50.                     Console.Write("{0} ",r.inf);
  51.                     Inorder(r.right);
  52.                 }
  53.             }
  54.             public static void Postorder (Node r)
  55.             {
  56.                 if (r!=null)
  57.                 {
  58.                     Postorder(r.left);
  59.                     Postorder(r.right);
  60.                     Console.Write("{0} ",r.inf);
  61.                 }
  62.             }
  63.             public static void Search(Node r, object key, out Node item)
  64.             {
  65.                 if (r==null)
  66.                 {
  67.                     item=null;
  68.                 }
  69.                 else
  70.                 {
  71.                     if (((IComparable)(r.inf)).CompareTo(key) == 0)
  72.                     {
  73.                         item=r;
  74.                     }
  75.                     else
  76.                     {
  77.                         if (((IComparable)(r.inf)).CompareTo(key) > 0)
  78.                         {
  79.                             Search(r.left, key, out item);
  80.                         }
  81.                         else
  82.                         {
  83.                             Search (r.right, key, out item);
  84.                         }
  85.                     }
  86.                 }
  87.             }
  88.             private static void Del (Node t, ref Node tr)
  89.             {
  90.                 if (tr.right!=null)
  91.                 {
  92.                     Del(t, ref tr.right);
  93.                 }
  94.                 else
  95.                 {
  96.                     t.inf=tr.inf;tr=tr.left;
  97.                 }
  98.             }
  99.             public static void Delete (ref Node t, object key)
  100.             {
  101.                 if (t==null)
  102.                 {
  103.                     throw new Exception("Данное значение в дереве отсутствует");
  104.                 }
  105.                 else
  106.                 {
  107.                     if (((IComparable)(t.inf)).CompareTo(key) > 0)
  108.                     {
  109.                         Delete(ref t.left, key);
  110.                     }
  111.                     else
  112.                     {
  113.                         if (((IComparable)(t.inf)).CompareTo(key) <0)
  114.                         {
  115.                             Delete(ref t.right, key);
  116.                         }
  117.                         else
  118.                         {
  119.                             if (t.left==null)
  120.                             {
  121.                                 t=t.right;
  122.                             }
  123.                             else
  124.                             {
  125.                                 if(t.right==null)
  126.                                 {
  127.                                     t=t.left;
  128.                                 }
  129.                                 else
  130.                                 {
  131.                                     Del(t, ref t.left);
  132.                                 }
  133.                             }
  134.                         }
  135.                     }
  136.                 }
  137.             }
  138.             public static void RotationRigth(ref Node t)
  139.             {
  140.                 Node x = t.left;  
  141.                 t.left = x.right;
  142.                 x.right = t;  
  143.                 t = x;
  144.             }
  145.             public static void RotationLeft(ref Node t)
  146.             {
  147.                 Node x = t.right;      
  148.                 t.right = x.left;
  149.                 x.left = t;
  150.                 t = x;
  151.             }
  152.             public static void InsertToRoot(ref Node t, int item)
  153.             {
  154.                 if (t == null)
  155.                 {
  156.                     t = new Node(item);
  157.                 }
  158.                 else
  159.                     if (((IComparable)(t.inf)).CompareTo(item) > 0)  
  160.                     {
  161.                         InsertToRoot(ref t.left, item);  
  162.                         RotationRigth(ref t);
  163.                     }
  164.                     else
  165.                     {    
  166.                         InsertToRoot(ref t.right, item);
  167.                         RotationLeft(ref t);  
  168.                     }
  169.             }
  170.             public static Node JoinTree(Node a, Node b)
  171.             {
  172.                 if (b == null)
  173.                     return a;
  174.                 if (a == null)
  175.                     return b;    
  176.                 InsertToRoot(ref b, a.inf);
  177.                 b.left = JoinTree(a.left, b.left);  
  178.                 b.right = JoinTree(a.right, b.right);
  179.                 return b;
  180.             }
  181.             /*public static void InsertRandom(ref Node r, object nodeInf, Random rnd)
  182.             {
  183.                 if (r == null) //если узел пустой, то производим создаем узел-лист
  184.                 {
  185.                     r = new Node(nodeInf);
  186.                 } else //иначе, если достигается вероятность 1/(N+1), то производим вставку в корень
  187.                 {
  188.                     if (rnd.Next() < int.MaxValue / (r.counter + 1))
  189.                     {  
  190.                         InsertToRoot(ref r, nodeInf);  
  191.                     } else //иначе продолжаем рекурсивный поиск местоположения нового узла
  192.                     {  
  193.                         r.counter++;
  194.                         if (((IComparable)(r.inf)).CompareTo(nodeInf) > 0)  
  195.                         {    
  196.                             Add(ref r.left, nodeInf);  
  197.                         } else
  198.                         {  
  199.                             Add(ref r.rigth, nodeInf);
  200.                         }    
  201.                     }
  202.                 }
  203.             }
  204.         public static void Part(ref Node t, int k)
  205.             {
  206.             int x = (t.left == null) ? 0 : t.left.counter;
  207.             if (x > k)
  208.             {    
  209.                 Part(ref t.left, k);
  210.                 RotationRigth(ref t);
  211.             }
  212.             if (x < k)
  213.             {  
  214.                 Part(ref t.rigth, k - x - 1);  
  215.                 RotationLeft(ref t);
  216.             }
  217.         }
  218.             public static void Balancer(ref Node t)
  219.         {
  220.             if (t == null || t.counter == 1) return; //если дерево пустое или узел-лист, то  
  221.             //балансировка закончена
  222.             Part(ref t, t.counter / 2); //иначе вызываем метод, который помещает к-тый узел в
  223.             //корень дерева (к= t.counter / 2)  
  224.             //затем балансируем левое и правое поддерево  
  225.             Balancer(ref t.left);
  226.             Balancer(ref t.rigth);
  227.         }*/
  228.             public static void Average(Node r)
  229.             {
  230.                 if (r!=null)
  231.                 {
  232.                     if (r.inf >= 0)
  233.                     {
  234.                         sum += (float)r.inf;
  235.                         cnt++;
  236.                     }  
  237.                     Average (r.left);
  238.                     Average (r.right);
  239.                 }
  240.                
  241.             }
  242.             public static void GetDepth(Node r)
  243.             {
  244.                 if (r != null)
  245.                 {
  246.                     using(StreamWriter output = new StreamWriter("C:/Users/CryDone/Desktop/practice/output.txt", true))
  247.                           {
  248.                             output.WriteLine("\nГлубина узла {0}: {1}", r.inf, depth); }
  249.                     if (r.left != null) {
  250.                         depth++;
  251.                         GetDepth(r.left);
  252.                         depth--;
  253.                     }
  254.                     if (r.right != null) {
  255.                         depth++;
  256.                         GetDepth(r.right);
  257.                         depth--;
  258.                     }
  259.                 }
  260.             }
  261.            
  262.         }
  263.         public static int depth = 0;
  264.         public static float sum = 0;
  265.         public static int cnt = 0;
  266.         Node tree;
  267.         public int Inf
  268.         {
  269.             set
  270.             {
  271.                 tree.inf=value;
  272.             }
  273.             get
  274.             {
  275.                 return tree.inf;
  276.             }
  277.         }
  278.         public BinaryTree()
  279.         {
  280.             tree=null;
  281.         }
  282.         private BinaryTree(Node r)
  283.         {
  284.             tree=r;
  285.         }
  286.         public void Add(int nodeInf)
  287.         {
  288.             Node.Add(ref tree, nodeInf);
  289.         }
  290.         public void Preorder ()
  291.         {
  292.             Node.Preorder(tree);
  293.         }
  294.         public void Inorder ()
  295.         {
  296.             Node.Inorder (tree);
  297.         }
  298.         public void Postorder ()
  299.         {
  300.             Node.Postorder(tree);
  301.         }
  302.         public BinaryTree Search(object key)
  303.         {
  304.             Node r;
  305.             Node.Search(tree, key, out r);
  306.             BinaryTree t = new BinaryTree(r);
  307.             return t;
  308.         }
  309.         public void Delete(object key)
  310.         {
  311.             Node.Delete(ref tree, key);
  312.         }
  313.         public void InsertToRoot(int item)
  314.         {
  315.             Node.InsertToRoot(ref tree, item);
  316.         }
  317.         public void JoinTree(ref BinaryTree b)
  318.         {
  319.             b = new BinaryTree(Node.JoinTree(this.tree, b.tree));
  320.         }
  321.         /*public void InsertRandom(object nodeInf)
  322.         {
  323.             Random rnd = new Random();
  324.             Node.InsertRandom(ref tree, nodeInf, rnd);
  325.         }
  326.         public void Balancer()
  327.         {
  328.             Node.Balancer(ref tree);
  329.         }*/
  330.         public void Average()
  331.         {
  332.             Node.Average(tree);
  333.             Console.WriteLine("\nСреднее арифметическое положительных узлов: {0}", sum/cnt);
  334.         }
  335.         public void GetDepth()
  336.         {
  337.             Node.GetDepth(tree);
  338.         }
  339.     }
  340.  
  341. class Program  
  342. {
  343.    
  344.     static void Main()
  345.     {
  346.         BinaryTree tree = new BinaryTree();
  347.         using (StreamReader input = new StreamReader("C:/Users/CryDone/Desktop/practice/input.txt"))  
  348.         {
  349.             string line = input.ReadToEnd();
  350.             string[] data = line.Split(' ');
  351.             foreach (string item in data)  
  352.             {    
  353.                 tree.Add(int.Parse(item));  
  354.             }      
  355.         }  
  356.         tree.GetDepth();
  357.    
  358.     }
  359. }
  360. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement