Advertisement
Guest User

Trees

a guest
Jan 23rd, 2018
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.21 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.  
  7. namespace Library
  8. {
  9. public class ForTree
  10. {
  11. public class Tree
  12. // Инициализация бинарного дерева
  13. {
  14. public char data;
  15. public Tree left, //адрес левого поддерева
  16. right; //адрес правого поддерева
  17. public Tree()
  18. {
  19. data = '0';
  20. left = null;
  21. right = null;
  22. }
  23. public Tree(char d)
  24. {
  25. data = d;
  26. left = null;
  27. right = null;
  28. }
  29. public override string ToString()
  30. {
  31. return data + " ";
  32. }
  33.  
  34. }
  35.  
  36. static Tree MakeTree(char value)
  37. //Создание элемента типа Tree
  38. {
  39. Tree p = new Tree(value);
  40. return p;
  41. }
  42.  
  43. static char GetValue()
  44. // Создание элемента типа char, ввод с клавиатуры
  45. {
  46. char info = CheckChar();
  47. return info;
  48. }
  49.  
  50. static char GetValue(Random rnd)
  51. // Создание элемента типа char с помощью ДСЧ
  52. {
  53. char info = (char)rnd.Next(33, 122); //Явное преобразование типов
  54. return info;
  55. }
  56.  
  57. static char CheckChar()
  58. // Проверка элемента для добавления в дерево (вручную)
  59. {
  60. Console.WriteLine("Введите элемент (тип char)");
  61. bool ok;
  62. char info;
  63. do
  64. {
  65. string buf = Console.ReadLine();
  66. ok = Char.TryParse(buf, out info);
  67. if (!ok)
  68. Console.WriteLine("Символ char введен неверно. Повторите ввод.");
  69. } while (!ok);
  70. return info;
  71. }
  72.  
  73. public static Tree IdealTree(int size)
  74. // Формирование идеально сбалансированного дерева
  75. // Заполнение с клавиатуры
  76. {
  77. if (size == 0) return null;
  78. int nl = size / 2;
  79. int nr = size - nl - 1;
  80. char number = GetValue();
  81. Tree r = MakeTree(number);
  82. r.left = IdealTree(nl);
  83. r.right = IdealTree(nr);
  84. return r;
  85. }
  86.  
  87. public static Tree IdealTree(int size, Random rnd)
  88. // Формирование идеально сбалансированного дерева
  89. // Заполнение random
  90. {
  91. if (size == 0) return null;
  92. int nl = size / 2;
  93. int nr = size - nl - 1;
  94. char number = GetValue(rnd);
  95. Tree root = MakeTree(number);
  96. root.left = IdealTree(nl, rnd);
  97. root.right = IdealTree(nr, rnd);
  98. return root;
  99. }
  100.  
  101. public static Tree FormTree()
  102. // Заполнение бинарного дерева с выбором
  103. {
  104. Console.WriteLine("Введите размер дерева");
  105. int size = Arrays.InputNatNumber();
  106. Tree idTree = null;
  107. Random rnd = new Random();
  108. bool ok = false;
  109. do
  110. {
  111. Console.ForegroundColor = ConsoleColor.White;
  112. Console.WriteLine("\nКак будем заполнять дерево?" +
  113. "\n1. Ввод с клавиатуры" +
  114. "\n2. Автозаполнение с помощью random");
  115. string MakeTree = Console.ReadLine();
  116. switch (MakeTree)
  117. {
  118. case "1":
  119. idTree = IdealTree(size);
  120. ok = true;
  121. break;
  122. case "2":
  123. idTree = IdealTree(size, rnd);
  124. ok = true;
  125. break;
  126. default:
  127. Console.ForegroundColor = ConsoleColor.Red;
  128. Console.WriteLine("Неверный номер команды. Повторите ввод ");
  129. break;
  130. }
  131. } while (!ok);
  132. Console.ResetColor();
  133. return idTree;
  134. }
  135.  
  136. public static Tree Add(Tree root, char info)
  137. // Добавление элемента в дерево поиска
  138. {
  139. if (root == null || root.data == '0')
  140. return MakeTree(info);
  141. Tree tek = root;
  142. Tree anc = null;
  143. while (tek != null) //спускаемся "вниз" дерева
  144. {
  145. anc = tek;
  146. if (info == tek.data)
  147. {
  148. Console.WriteLine("Элемент {0} уже существует в дереве", info);
  149. return root;
  150. }
  151. else if (info > tek.data) //если элемент больше текущего
  152. tek = tek.right; //идем вправо
  153. else
  154. tek = tek.left; //идем влево
  155. }
  156. tek = MakeTree(info);
  157. if (tek.data > anc.data)
  158. anc.right = tek; //добавление в правую часть
  159. else
  160. anc.left = tek; //добавление в левую часть
  161. return root;
  162. }
  163.  
  164. public static void BuildSearchTree(Tree idTree, ref Tree srch)
  165. //Построение дерева поиска
  166. {
  167. srch = Add(srch, idTree.data);
  168. if (idTree.left != null)
  169. BuildSearchTree(idTree.left, ref srch);
  170. if (idTree.right != null)
  171. BuildSearchTree(idTree.right, ref srch);
  172. }
  173.  
  174. public static int CountElems(char value, Tree root)
  175. //Подсчет количества элементов с заданным ключом
  176. {
  177. int number = 0;
  178. if (value == root.data)
  179. number++;
  180. if (root.left != null)
  181. number += CountElems(value, root.left);
  182. if (root.right != null)
  183. number += CountElems(value, root.right);
  184. return number;
  185. }
  186.  
  187. public static void WorkWithTree()
  188. {
  189. Tree idTree = FormTree();
  190. Console.WriteLine("Исходное дерево: ");
  191. ShowTree(idTree, 10);
  192. Console.WriteLine("Элемент для поиска ");
  193. char elem = CheckChar();
  194. int kolvo = CountElems(elem, idTree);
  195. if (kolvo == 0) Console.WriteLine("Элемента с заданным значением нет в дереве");
  196. else
  197. Console.WriteLine("Элемент {0} встречается {1} раз ", elem, kolvo);
  198.  
  199. Tree SearchTree = new Tree();
  200. BuildSearchTree(idTree, ref SearchTree);
  201. idTree = SearchTree;
  202. Console.WriteLine("Перестроенное в дерево поиска: ");
  203. ShowTree(SearchTree, 10);
  204. }
  205.  
  206. public static void ShowTree(Tree root, int l)
  207. // Печать дерева
  208. {
  209. if (root != null)
  210. {
  211. ShowTree(root.right, l + 3); //переход к правому поддереву
  212. //формирование отступа
  213. for (int i = 0; i < l; i++) Console.Write(" ");
  214. Console.WriteLine(root.data); //печать узла
  215. ShowTree(root.left, l + 3); //переход к левому поддереву
  216. }
  217. }
  218. }
  219. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement