Sephinroth

21.1

Apr 20th, 2020
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.99 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.            
  243.         }
  244.         public static float sum = 0;
  245.         public static int cnt = 0;
  246.         Node tree;
  247.         public int Inf
  248.         {
  249.             set
  250.             {
  251.                 tree.inf=value;
  252.             }
  253.             get
  254.             {
  255.                 return tree.inf;
  256.             }
  257.         }
  258.         public BinaryTree()
  259.         {
  260.             tree=null;
  261.         }
  262.         private BinaryTree(Node r)
  263.         {
  264.             tree=r;
  265.         }
  266.         public void Add(int nodeInf)
  267.         {
  268.             Node.Add(ref tree, nodeInf);
  269.         }
  270.         public void Preorder ()
  271.         {
  272.             Node.Preorder(tree);
  273.         }
  274.         public void Inorder ()
  275.         {
  276.             Node.Inorder (tree);
  277.         }
  278.         public void Postorder ()
  279.         {
  280.             Node.Postorder(tree);
  281.         }
  282.         public BinaryTree Search(object key)
  283.         {
  284.             Node r;
  285.             Node.Search(tree, key, out r);
  286.             BinaryTree t = new BinaryTree(r);
  287.             return t;
  288.         }
  289.         public void Delete(object key)
  290.         {
  291.             Node.Delete(ref tree, key);
  292.         }
  293.         public void InsertToRoot(int item)
  294.         {
  295.             Node.InsertToRoot(ref tree, item);
  296.         }
  297.         public void JoinTree(ref BinaryTree b)
  298.         {
  299.             b = new BinaryTree(Node.JoinTree(this.tree, b.tree));
  300.         }
  301.         /*public void InsertRandom(object nodeInf)
  302.         {
  303.             Random rnd = new Random();
  304.             Node.InsertRandom(ref tree, nodeInf, rnd);
  305.         }
  306.         public void Balancer()
  307.         {
  308.             Node.Balancer(ref tree);
  309.         }*/
  310.         public void Average()
  311.         {
  312.             Node.Average(tree);
  313.             Console.WriteLine("\nСреднее арифметическое положительных узлов: {0}", sum/cnt);
  314.         }
  315.     }
  316.  
  317. class Program  
  318. {
  319.    
  320.     static void Main()
  321.     {
  322.         BinaryTree tree = new BinaryTree();
  323.         using (StreamReader input = new StreamReader("C:/Users/CryDone/Desktop/practice/input.txt"))  
  324.         {
  325.             string line = input.ReadToEnd();
  326.             string[] data = line.Split(' ');
  327.             foreach (string item in data)  
  328.             {    
  329.                 tree.Add(int.Parse(item));  
  330.             }      
  331.         }  
  332.         tree.Preorder();
  333.         tree.Average();
  334.         Console.ReadKey();
  335.     }
  336. }
  337. }
Add Comment
Please, Sign In to add comment