Advertisement
OLLI_BS

Height_Node

Mar 28th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.47 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.     {
  13.         //вложенный класс, отвечающий за узлы и операции допустимы для дерева бинарного
  14.         //поиска
  15.         private class Node
  16.         {
  17.             public object inf;
  18.             //информационное поле public
  19.             protected Node left;
  20.             //ссылка на левое поддерево
  21.             protected Node right;
  22.             //ссылка на правое поддерево
  23.             //конструктор вложенного класса, создает узел дерева
  24.             public Node(object nodeInf)
  25.             {
  26.                 inf = nodeInf;
  27.                 left = null;
  28.                 right = null;
  29.             }
  30.             //добавляет узел в дерево так, чтобы дерево оставалось деревом бинарного поиска
  31.             public static void Add(ref Node r, object nodeInf)
  32.             {
  33.                 if (r == null)
  34.                 {
  35.                     r = new Node(nodeInf);
  36.                 }
  37.                 else
  38.                 {
  39.                     if (((IComparable)(r.inf)).CompareTo(nodeInf) > 0)
  40.                     {
  41.                         Add(ref r.left, nodeInf);
  42.                     }
  43.                     else
  44.                     {
  45.                         Add(ref r.right, nodeInf);
  46.                     }
  47.                 }
  48.             }
  49.  
  50.  
  51.             // /*/*//*/*//*/*//*/*//*/*//*/*/ ||||| \*\*\\*\*\\*\*\\*\*\\*\*\\*\*\  
  52.  
  53.             public static void negativeValue(Node r, ref int temp) // 1) 4.перемножение отрицательных              
  54.             {
  55.                 if (r != null)
  56.                 {
  57.                     if ((int)r.inf < 0)
  58.                     {
  59.                         temp *= (int)r.inf;
  60.                     }
  61.                     negativeValue(r.left, ref temp);
  62.                     negativeValue(r.right, ref temp);
  63.                 }
  64.             }
  65.  
  66.             public int getNodeHeight()//2) 4. для каждого узла дерева вычислить его высоту
  67.             {
  68.                 int leftHeight = this.left == null ? 0 : this.left.getNodeHeight();
  69.                 int rightHeight = this.right == null ? 0 : this.right.getNodeHeight();
  70.                 Console.WriteLine("Height node {0} = {1}", this.inf, 1 + Math.Max(leftHeight, rightHeight));
  71.                 return 1 + Math.Max(leftHeight, rightHeight);
  72.             }
  73.  
  74.             // \*\*\\*\*\\*\*\\*\*\\*\*\\*\*\ ||||| /*/*//*/*//*/*//*/*//*/*//*/*/                          
  75.  
  76.             public static void Preorder(Node r) //прямой обход дерева
  77.             {
  78.                 if (r != null)
  79.                 {
  80.                     Console.Write("{0} ", r.inf);
  81.                     Preorder(r.left);
  82.                     Preorder(r.right);
  83.                 }
  84.             }
  85.  
  86.             public static void Inorder(Node r) //симметричный обход дерева
  87.             {
  88.                 if (r != null)
  89.                 {
  90.                     Inorder(r.left);
  91.                     Console.Write("{0} ", r.inf);
  92.                     Inorder(r.right);
  93.                 }
  94.             }
  95.  
  96.             public static void Postorder(Node r) //обратный обход дерева
  97.             {
  98.                 if (r != null)
  99.                 {
  100.                     Postorder(r.left);
  101.                     Postorder(r.right);
  102.                     Console.Write("{0} ", r.inf);
  103.                 }
  104.             }
  105.  
  106.             public static void Search(Node r, object key, out Node item) //поиск ключевого узла в дереве
  107.             {
  108.                 if (r == null)
  109.                 {
  110.                     item = null;
  111.                 }
  112.                 else
  113.                 {
  114.                     if (((IComparable)(r.inf)).CompareTo(key) == 0)
  115.                     {
  116.                         item = r;
  117.                     }
  118.                     else
  119.                     {
  120.                         if (((IComparable)(r.inf)).CompareTo(key) > 0)
  121.                         {
  122.                             Search(r.left, key, out item);
  123.                         }
  124.                         else
  125.                         {
  126.                             Search(r.right, key, out item);
  127.                         }
  128.                     }
  129.                 }
  130.             }
  131.  
  132.             //методы Del и Delete позволяют удалить узел в дереве так, чтобы дерево при этом
  133.             //оставалось деревом бинарного поиска
  134.             private static void Del(Node t, ref Node tr)
  135.             {
  136.                 if (tr.right != null)
  137.                 {
  138.                     Del(t, ref tr.right);
  139.                 }
  140.                 else
  141.                 {
  142.                     t.inf = tr.inf;
  143.                     tr = tr.left;
  144.                 }
  145.             }
  146.  
  147.             public static void Delete(ref Node t, object key)
  148.             {
  149.                 if (t == null)
  150.                 {
  151.                     throw new Exception("Данное значение в дереве отсутствует");
  152.                 }
  153.                 else
  154.                 {
  155.                     if (((IComparable)(t.inf)).CompareTo(key) > 0)
  156.                     {
  157.                         Delete(ref t.left, key);
  158.                     }
  159.                     else
  160.                     {
  161.                         if (((IComparable)(t.inf)).CompareTo(key) < 0)
  162.                         {
  163.                             Delete(ref t.right, key);
  164.                         }
  165.                         else
  166.                         {
  167.                             if (t.left == null)
  168.                             {
  169.                                 t = t.right;
  170.                             }
  171.                             else
  172.                             {
  173.                                 if (t.right == null)
  174.                                 {
  175.                                     t = t.left;
  176.                                 }
  177.                                 else
  178.                                 {
  179.                                     Del(t, ref t.left);
  180.                                 }
  181.                             }
  182.                         }
  183.                     }
  184.                 }
  185.             }
  186.         }
  187.  
  188.         Node tree;//ссылка на корень дерева
  189.  
  190.         public object Inf //свойство позволяет получить доступ к значению информационного поля корня дерева
  191.         {
  192.             set { tree.inf = value; }
  193.             get { return tree.inf; }
  194.         }
  195.  
  196.         public BinaryTree() //открытый конструктор        
  197.         {
  198.             tree = null;
  199.         }
  200.  
  201.         private BinaryTree(Node r) //закрытый конструктор
  202.         {
  203.             tree = r;
  204.         }
  205.  
  206.         public void Add(object nodeInf) //добавление узла
  207.         {
  208.             Node.Add(ref tree, nodeInf);
  209.         }
  210.  
  211.         //обходы
  212.         public void Preorder() //прямой
  213.         {
  214.             Node.Preorder(tree);
  215.         }
  216.  
  217.         public void Inorder() //симетричный
  218.         {
  219.             Node.Inorder(tree);
  220.         }
  221.  
  222.         public void Postorder() //обратный
  223.         {
  224.             Node.Postorder(tree);
  225.         }
  226.  
  227.         public BinaryTree Search(object key) //поиск ключевого узла в дереве
  228.         {
  229.             Node r;
  230.             Node.Search(tree, key, out r);
  231.             BinaryTree t = new BinaryTree(r);
  232.             return t;
  233.         }
  234.  
  235.         public void Delete(object key) //удаление ключевого узла в дереве
  236.         {
  237.             Node.Delete(ref tree, key);
  238.         }
  239.  
  240.         // /*/*//*/*//*/*//*/*//*/*//*/*/ ||||| \*\*\\*\*\\*\*\\*\*\\*\*\\*\*\                          
  241.  
  242.         public void Negative() //свойство возвращающее значение произведения отрицательных элементов
  243.         {
  244.             int temp = 1;
  245.             Node.negativeValue(tree, ref temp);
  246.             Console.WriteLine("{0} ", temp);
  247.         }
  248.  
  249.         public int GetHeight()
  250.         {
  251.             return tree == null ? 0 : tree.getNodeHeight();
  252.         }
  253.  
  254.         // \*\*\\*\*\\*\*\\*\*\\*\*\\*\*\ ||||| /*/*//*/*//*/*//*/*//*/*//*/*/                          
  255.     }
  256.  
  257.     class Programm
  258.     {
  259.         static void Main(string[] args)
  260.         {
  261.             BinaryTree tree = new BinaryTree();
  262.             using (StreamReader fileIn = new StreamReader("../../input.txt"))
  263.             {
  264.                 string line = fileIn.ReadToEnd();
  265.                 string[] data = line.Split(' ');
  266.                 foreach (string item in data)
  267.                 {
  268.                     tree.Add(int.Parse(item));
  269.                 }
  270.             }
  271.  
  272.             tree.Negative();
  273.             Console.WriteLine();
  274.  
  275.             tree.GetHeight();
  276.             Console.WriteLine();
  277.  
  278.             Console.ReadKey();
  279.         }
  280.     }
  281. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement