Поиск наибольшего элемента дерева - C#

Узнай цену своей работы

Формулировка задачи:

Помогите, написать функцию, которая находит наибольший элемент дерева. Разработаны универсальные классы, но задача не получается.
Листинг программы
  1. using System;
  2. namespace Tree
  3. {
  4. class tree<BT> where BT : struct, IComparable<BT> // использованы ограничения на тип BT: это тип значений, причем сравнимых
  5. {
  6. public class node
  7. {
  8. public BT inf;
  9. public node L, R;
  10. };
  11. node root; // указатель на корень дерева
  12. private static node in_tree_r(node R, BT x) // рекурсивный метод добавления элемента в дерево
  13. {
  14. if (R != null)
  15. if (x.CompareTo(R.inf) < 0) // если x<R.inf
  16. R.L = in_tree_r(R.L, x);
  17. else
  18. R.R = in_tree_r(R.R, x);
  19. else
  20. {
  21. R = new node();
  22. R.L = null;
  23. R.R = null;
  24. R.inf = x;
  25. }
  26. return R;
  27. }
  28. private static node out_tree(node R, BT x) // рекурсивный метод удаления элемента из дерева
  29. {
  30. node P, v;
  31. if (R == null)
  32. { Console.WriteLine("Дерево не содержит элемента со значением {0}", x); return R; }
  33. else
  34. if (x.CompareTo(R.inf) < 0) // если x<R.inf
  35. R.L = out_tree(R.L, x);
  36. else
  37. if (x.CompareTo(R.inf) > 0) // если x>R.inf
  38. R.R = out_tree(R.R, x);
  39. else
  40. {
  41. P = R;
  42. if (R.R == null)
  43. R = R.L; // случай 1 - у удаляемого узла не более одного поддерева
  44. else
  45. if (R.L == null)
  46. R = R.R; // случай 1 - у удаляемого узла не более одного поддерева
  47. else // случай 2 - у удаляемого узла два поддерева
  48. {
  49. v = R.L;
  50. if (v.R != null)
  51. {
  52. while (v.R.R != null)
  53. v = v.R;
  54. R.inf = v.R.inf;
  55. P = v.R;
  56. v.R = v.R.L;
  57. }
  58. else
  59. {
  60. R.inf = v.inf;
  61. P = v;
  62. R.L = R.L.L;
  63. }
  64. } // закончили случай 2
  65. } // закончили удаление
  66. return R;
  67. }
  68. private static void print_tree(node R) // рекурсивный метод вывода элементов дерева
  69. {
  70. if (R != null)
  71. {
  72. print_tree(R.L);
  73. Console.Write("{0}; ", R.inf);
  74. print_tree(R.R);
  75. }
  76. }
  77. private static bool find_el(node R, BT x) // рекурсивный метод; возвращает true, если x есть в дереве и false в противном случае
  78. {
  79. if (R == null)
  80. return false;
  81. else
  82. if (x.CompareTo(R.inf) == 0) // если x==R.inf
  83. return true;
  84. else
  85. if (x.CompareTo(R.inf) < 0) // если x<R.inf
  86. return find_el(R.L, x);
  87. else
  88. return find_el(R.R, x);
  89. }
  90. public void in_t(BT x)
  91. {
  92. root = in_tree_r(root, x);
  93. }
  94. public void print()
  95. {
  96. print_tree(root);
  97. Console.WriteLine();
  98. Console.WriteLine();
  99. }
  100. public bool find(BT x)
  101. {
  102. return find_el(root, x);
  103. }
  104. public void out_t(BT x)
  105. {
  106. root = out_tree(root, x);
  107. }
  108. public void create_t() // создание дерева с заданным количеством элементов
  109. {
  110. BT x;
  111. root = null;
  112. Console.WriteLine("Сколько элементов в дереве? ");
  113. int n = Convert.ToInt32(Console.ReadLine());
  114. for (int i = 1; i <= n; i++)
  115. {
  116. Console.Write("Очередной элемент? ");
  117. x = (BT)Convert.ChangeType(Console.ReadLine(), typeof(BT)); // конвертируем введенное значение к нужному типу
  118. in_t(x);
  119. }
  120. }
  121. private static void s7(node R, ref node p) // рекурсивный метод, решающий поставленную задачу
  122. {
  123. if (R != null)
  124. {
  125. while (R.R != null)
  126. {
  127. p = R.R;
  128. s7(R.R, ref p);
  129. }
  130. }
  131. }
  132. public int solution7(int n)
  133. {
  134. int k = 0;
  135. s7(root, n, 0, ref k);
  136. return k;
  137. }
  138. };
  139. class Program
  140. {
  141. static void Main()
  142. {
  143. tree<int> T = new tree<int>();
  144. T.create_t();
  145. T.print();
  146. Console.WriteLine("Количество узлов на уровне {0} равно {1}", 3, T.solution7(3));
  147. Console.ReadKey();
  148. }
  149. }
  150. }

Решение задачи: «Поиск наибольшего элемента дерева»

textual
Листинг программы
  1.     class tree<BT> where BT : struct, IComparable<BT>
  2.     {
  3.         ....
  4.  
  5.         public static IEnumerable<node> GetThisAndAllChilds(node n)
  6.         {
  7.             if(n != null)
  8.             {
  9.                 yield return n;
  10.                 foreach (var child in GetThisAndAllChilds(n.L)) yield return child;
  11.                 foreach (var child in GetThisAndAllChilds(n.R)) yield return child;
  12.             }
  13.         }
  14.  
  15.         public node Max()
  16.         {
  17.             var max = root;
  18.             foreach (var n in GetThisAndAllChilds(root))
  19.                 if (n.inf.CompareTo(max.inf) > 0)
  20.                     max = n;
  21.             return max;
  22.         }
  23.     }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.5 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы