SaveText.Ru

Без имени
  1. using system;
  2. using system.Collections.Generic;
  3. using Human;
  4.  
  5. namespace Lab12
  6. {
  7.     class Node : IComparable<Node>
  8.     {
  9.         public IHuman Data { get; private set; }
  10.  
  11.         public Node Left { get; set; }
  12.  
  13.         public Node Right { get; set; }
  14.  
  15.         public int Level { get; set; }
  16.  
  17.         public Node()
  18.         {
  19.             Data = default(IHuman);
  20.             Left = null;
  21.             Right = null;
  22.             Level = 1;
  23.         }
  24.  
  25.         public Node(IHuman data)
  26.         {
  27.             Data = data;
  28.             Left = null;
  29.             Right = null;
  30.             Level = 1;
  31.         }
  32.  
  33.         public Node(IHuman data, Node left, Node right)
  34.         {
  35.             Data = data;
  36.             Left = left;
  37.             Right = right;
  38.             Level = 1;
  39.         }
  40.  
  41.         public Node CreateTree(int size, IHuman data, TreeType treeType)
  42.         {
  43.             Node newNode = new Node(data);
  44.             if (treeType == TreeType.Balanced)
  45.             {
  46.                 return BalancedTree(size, newNode);
  47.             }
  48.             else
  49.             {
  50.                 return default;
  51.             }
  52.         }
  53.  
  54.         public Node BalancedTree(int size, Node newNode)
  55.         {
  56.             newNode.Level++;
  57.  
  58.             if (size == 0)
  59.             {
  60.                 return null;
  61.             }
  62.  
  63.             int nl = size / 2;
  64.             int nr = size - nl - 1;
  65.  
  66.             newNode.Left = BalancedTree(nl, newNode);
  67.             newNode.Right = BalancedTree(nr, newNode);
  68.  
  69.             return newNode;
  70.         }
  71.  
  72.         public int CompareTo(Node other)
  73.         {
  74.             if (other == null)
  75.             {
  76.                 throw new ArgumentNullException(nameof(other));
  77.             }
  78.  
  79.             if (this.Data.Age > other.Data.Age) return 1;
  80.             if (this.Data.Age < other.Data.Age) return -1;
  81.  
  82.             return 0;
  83.         }
  84.  
  85.         public void Add(IHuman data, TreeType treeType)
  86.         {
  87.             Node newNode = new Node(data);
  88.             if (treeType == TreeType.Balanced)
  89.             {
  90.                 AddBalanced(newNode);
  91.             }
  92.             else
  93.             {
  94.                 AddSorted(newNode);
  95.             }
  96.         }
  97.  
  98.         private void AddBalanced(Node newNode)
  99.         {
  100.             newNode.Level++;
  101.  
  102.             if (Left == null)
  103.             {
  104.                 Left = newNode;
  105.                 return;
  106.             }
  107.  
  108.             if (Left != null && Right == null)
  109.             {
  110.                 Right = newNode;
  111.                 return;
  112.             }
  113.             else
  114.             {
  115.                 Left.AddBalanced(newNode);
  116.             }
  117.         }
  118.  
  119.         private void AddSorted(Node newNode)
  120.         {
  121.             newNode.Level++;
  122.  
  123.             if (newNode.CompareTo(this) == 0)
  124.             {
  125.                 throw new SameDataException($"В коллекции уже существует элемент с заданным значением Age ({newNode.Data.Age})");
  126.             }
  127.  
  128.             if (newNode.CompareTo(this) == -1)
  129.             {
  130.                 if (Left == null)
  131.                 {
  132.                     Left = newNode;
  133.                 }
  134.                 else
  135.                 {
  136.                     Left.AddSorted(newNode);
  137.                 }
  138.             }
  139.  
  140.             if (newNode.CompareTo(this) == 1)
  141.             {
  142.                 if (Right == null)
  143.                 {
  144.                     Right = newNode;
  145.                 }
  146.                 else
  147.                 {
  148.                     Right.AddSorted(newNode);
  149.                 }
  150.             }
  151.         }
  152.  
  153.         public void Print()
  154.         {
  155.             if (Right != null)
  156.             {
  157.                 Right.Print();
  158.             }
  159.  
  160.             Console.ForegroundColor = (ConsoleColor)Level;
  161.             for (int i = 0; i < Level - 1; i++)
  162.                 Console.Write("t");
  163.             Console.WriteLine(Data.Age);
  164.             Console.ResetColor();
  165.  
  166.             if (Left != null)
  167.             {
  168.                 Left.Print();
  169.             }
  170.         }
  171.  
  172.         public override string ToString()
  173.         {
  174.             return Data.ToString();
  175.         }
  176.     }
  177. }

Share with your friends:

Print