Advertisement
Guest User

tree.cs

a guest
Mar 29th, 2020
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.15 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace BinaryTree
  7. {
  8. /// <summary>
  9. /// Класс "Бинарное поисковое дерево"
  10. /// </summary>
  11. public class Tree
  12. {
  13. /// <summary>
  14. /// Класс "узел БПД"
  15. /// </summary>
  16. private class Item
  17. {
  18. /// <summary>
  19. /// info - значение, хранящееся в узле
  20. /// lSon, rSon, father - ссылки на левого, правого сына и отца
  21. /// </summary>
  22. public int info;
  23. public Item lSon, rSon, father;
  24. /// <summary>
  25. /// Конструктор узла БПД
  26. /// </summary>
  27. /// <param name="x">значение, хранящееся в узле</param>
  28. public Item(int x)
  29. {
  30. info = x;
  31. lSon = rSon = father = null;
  32. }
  33. }
  34.  
  35. /// <summary>
  36. /// ссылка на корень дерева
  37. /// </summary>
  38. private Item root;
  39.  
  40. /// <summary>
  41. /// конструктор дерева
  42. /// </summary>
  43. public Tree()
  44. {
  45. root = null;
  46. }
  47.  
  48. /// <summary>
  49. /// внутренняя процедура поиска
  50. /// </summary>
  51. /// <param name="x">искомое значение</param>
  52. /// <param name="p">ели найдено - ссылка на соответствующий узел, иначе - ссылка на то место, где остановились</param>
  53. /// <returns>нашли или нет</returns>
  54. private bool Find(int x, out Item p)
  55. {
  56. p = root;
  57. Item q = p;
  58. while (q != null)
  59. {
  60. p = q;
  61. if (q.info == x)
  62. return true;
  63. if (q.info < x)
  64. q = q.rSon;
  65. else
  66. q = q.lSon;
  67. }
  68. return false;
  69. }
  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.  
  82. /// <summary>
  83. /// втавка в БПД
  84. /// </summary>
  85. /// <param name="x">вставляемое значение</param>
  86. /// <returns>смогли вставить или нет</returns>
  87. public bool Insert(int x)
  88. {
  89. Item r, p;
  90. if (root == null)
  91. {
  92. r = new Item(x);
  93. root = r;
  94. return true;
  95. }
  96. if (Find(x, out r))
  97. return false;
  98. p = new Item(x);
  99. p.father = r;
  100. if (r.info < x)
  101. r.rSon = p;
  102. else
  103. r.lSon = p;
  104. return true;
  105. }
  106.  
  107. /// <summary>
  108. /// удалить вершину (оборвать все ссылки)
  109. /// </summary>
  110. /// <param name="x">удаляемая вершина</param>
  111. private void deleteItem(Item x)
  112. {
  113. if (x.father == null)
  114. if (x.lSon != null)
  115. {
  116. root = x.lSon;
  117. x.lSon.father = null;
  118. }
  119. else
  120. {
  121. root = x.rSon;
  122. if (x.rSon != null)
  123. x.rSon.father = null;
  124. }
  125. else
  126. if (x.father.lSon == x)
  127. if (x.lSon != null)
  128. {
  129. x.father.lSon = x.lSon;
  130. x.lSon.father = x.father;
  131. }
  132. else
  133. {
  134. x.father.lSon = x.rSon;
  135. if (x.rSon != null)
  136. x.rSon.father = x.father;
  137. }
  138. else
  139. if (x.lSon != null)
  140. {
  141. x.father.rSon = x.lSon;
  142. x.lSon.father = x.father;
  143. }
  144. else
  145. {
  146. x.father.rSon = x.rSon;
  147. if (x.rSon != null)
  148. x.rSon.father = x.father;
  149. }
  150. x.father = x.lSon = x.rSon = null;
  151. }
  152.  
  153. /// <summary>
  154. /// Удалить вершину по значению
  155. /// </summary>
  156. /// <param name="x">удаляемое значение</param>
  157. /// <returns>смогли удалить или нет</returns>
  158. public bool Delete(int x)
  159. {
  160. Item r, p;
  161. if (!Find(x, out r))
  162. return false;
  163. if ((r.lSon == null) || (r.rSon == null))
  164. {
  165. deleteItem(r);
  166. return true;
  167. }
  168. p = r.lSon;
  169. while (p.rSon != null)
  170. p = p.rSon;
  171. r.info = p.info;
  172. deleteItem(p);
  173. return true;
  174. }
  175.  
  176.  
  177. // Метод определяющий глубину нахождения элемента
  178. public int Find_on_Level(int x)
  179. {
  180. int counter = 1;
  181. Item temp = root;
  182. for (; ; )
  183. {
  184. if (x == temp.info)
  185. {
  186. break;
  187.  
  188. }
  189. if (x < temp.info)
  190. {
  191. temp = temp.lSon;
  192. }
  193. if (x > temp.info)
  194. {
  195. temp = temp.rSon;
  196. }
  197. ++counter;
  198. }
  199. return counter;
  200. }
  201.  
  202.  
  203. // Метод выводящий элементы лежащие на определённом уровне
  204. public void Elements_on_Level(int x)
  205. {
  206. bool[] used = new bool[1000];
  207. Queue<Item> q = new Queue<Item>();
  208. q.Enqueue(root);
  209. used[root.info] = true;
  210.  
  211. while (q.Count != 0)
  212. {
  213.  
  214.  
  215. Item cur = q.Dequeue();
  216.  
  217. if (Find_on_Level(cur.info) == Find_on_Level(x))
  218. {
  219. Console.WriteLine("Точка: " + cur.ToString() + " находится на уровне + " + Find_on_Level(x).ToString());
  220. }
  221.  
  222. for (int i = 0; i < 2; i++)
  223. {
  224. if (i == 0)
  225. {
  226. q.Enqueue(cur.rSon);
  227. used[(cur.rSon).info] = true;
  228. }
  229. else if (i == 1)
  230. {
  231. q.Enqueue(cur.lSon);
  232. used[(cur.lSon).info] = true;
  233. }
  234. }
  235.  
  236.  
  237.  
  238.  
  239. }
  240. }
  241. }
  242. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement