Реализовать обход бинарного дерева в ширину - C#

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

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

необходимо реализовать обход вот этого бинарного дерева в ширину
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6. namespace BinaryTree
  7. {
  8. /// <summary>
  9. /// Класс "Бинарное поисковое дерево"
  10. /// </summary>
  11. public class Tree
  12. {
  13. public int Value;
  14. public int Count = 0;
  15. Tree Left;
  16. Tree Right;
  17. /// <summary>
  18. /// Класс "узел БПД"
  19. /// </summary>
  20. private class Item
  21. {
  22. /// <summary>
  23. /// info - значение, хранящееся в узле
  24. /// lSon, rSon, father - ссылки на левого, правого сына и отца
  25. /// </summary>
  26. public int info;
  27. public Item lSon, rSon, father;
  28. /// <summary>
  29. /// Конструктор узла БПД
  30. /// </summary>
  31. /// <param name="x">значение, хранящееся в узле</param>
  32. public Item(int x)
  33. {
  34. info = x;
  35. lSon = rSon = father = null;
  36. }
  37. }
  38. /// <summary>
  39. /// ссылка на корень дерева
  40. /// </summary>
  41. private Item root;
  42. /// <summary>
  43. /// конструктор дерева
  44. /// </summary>
  45. public Tree()
  46. {
  47. root = null;
  48. }
  49. /// <summary>
  50. /// внутренняя процедура поиска
  51. /// </summary>
  52. /// <param name="x">искомое значение</param>
  53. /// <param name="p">ели найдено - ссылка на соответствующий узел, иначе - ссылка на то место, где остановились</param>
  54. /// <returns>нашли или нет</returns>
  55. private bool Find(int x, out Item p)
  56. {
  57. p = root;
  58. Item q = p;
  59. while (q != null)
  60. {
  61. p = q;
  62. if (q.info == x)
  63. return true;
  64. if (q.info < x)
  65. q = q.rSon;
  66. else
  67. q = q.lSon;
  68. }
  69. return false;
  70. }
  71. /// <summary>
  72. /// внешняя процедура поиска
  73. /// </summary>
  74. /// <param name="x">искомое значение</param>
  75. /// <returns>нашли или нет</returns>
  76. public bool Find(int x)
  77. {
  78. Item p;
  79. return Find(x, out p);
  80. }
  81. /// <summary>
  82. /// втавка в БПД
  83. /// </summary>
  84. /// <param name="x">вставляемое значение</param>
  85. /// <returns>смогли вставить или нет</returns>
  86. public bool Insert(int x)
  87. {
  88. Item r, p;
  89. if (root == null)
  90. {
  91. r= new Item(x);
  92. root = r;
  93. return true;
  94. }
  95. if (Find(x, out r))
  96. return false;
  97. p = new Item(x);
  98. p.father = r;
  99. if (r.info < x)
  100. r.rSon = p;
  101. else
  102. r.lSon = p;
  103. return true;
  104. }
  105. /// <summary>
  106. /// удалить вершину (оборвать все ссылки)
  107. /// </summary>
  108. /// <param name="x">удаляемая вершина</param>
  109. private void deleteItem(Item x)
  110. {
  111. if (x.father == null)
  112. if (x.lSon != null) {
  113. root = x.lSon;
  114. x.lSon.father = null;
  115. }
  116. else {
  117. root = x.rSon;
  118. if (x.rSon != null)
  119. x.rSon.father = null;
  120. }
  121. else
  122. if (x.father.lSon == x)
  123. if (x.lSon != null) {
  124. x.father.lSon = x.lSon;
  125. x.lSon.father = x.father;
  126. }
  127. else {
  128. x.father.lSon = x.rSon;
  129. if (x.rSon != null)
  130. x.rSon.father = x.father;
  131. }
  132. else
  133. if (x.lSon != null) {
  134. x.father.rSon = x.lSon;
  135. x.lSon.father = x.father;
  136. }
  137. else {
  138. x.father.rSon = x.rSon;
  139. if (x.rSon != null)
  140. x.rSon.father = x.father;
  141. }
  142. x.father = x.lSon = x.rSon = null;
  143. }
  144. /// <summary>
  145. /// Удалить вершину по значению
  146. /// </summary>
  147. /// <param name="x">удаляемое значение</param>
  148. /// <returns>смогли удалить или нет</returns>
  149. public bool Delete(int x)
  150. {
  151. Item r, p;
  152. if (!Find(x, out r))
  153. return false;
  154. if ((r.lSon == null) || (r.rSon == null))
  155. {
  156. deleteItem(r);
  157. return true;
  158. }
  159. p = r.lSon;
  160. while (p.rSon != null)
  161. p = p.rSon;
  162. r.info = p.info;
  163. deleteItem(p);
  164. return true;
  165. }
  166.  
  167. }
  168. }

Решение задачи: «Реализовать обход бинарного дерева в ширину»

textual
Листинг программы
  1.     public IEnumerable<int> TraverseLevelOrder()
  2.     {
  3.         if (root == null)
  4.             yield break;
  5.  
  6.         var queue = new Queue<Item>();
  7.         queue.Enqueue(root);
  8.  
  9.         while (queue.Count > 0) {
  10.             var node = queue.Dequeue();
  11.             yield return node.info;
  12.             if (node.lSon != null) queue.Enqueue(node.lSon);
  13.             if (node.rSon != null) queue.Enqueue(node.rSon);
  14.         }
  15.     }

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


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

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

9   голосов , оценка 4.222 из 5

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

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

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