Advertisement
Guest User

Untitled

a guest
Feb 7th, 2018
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.20 KB | None | 0 0
  1. program binaryTree;
  2. // класс описывающий узел дерева
  3. type
  4. Node = class
  5. public
  6. key:integer; // ключ, по которому производится поиск
  7. data:double; // данные в узле дерева
  8. left,right,parent: Node; // 3 указателя - на левого и правого ребенка узла
  9. // а также указатель на родителя узла
  10. end;
  11.  
  12. // класс двоичное дерево
  13. type
  14. BinaryTreeClass = class
  15. public
  16. root, currentElement : Node; // 2 указателя - на корень дерева и на текущий элемент
  17. size : integer; // размер дерева - суммарное кол-во всех узлов
  18.  
  19. // процедура добавления нового узла в дерево
  20. // если такое значение уже хранится в дереве, то алгоритм
  21. // вставит его как правого потомка этого узла
  22. procedure add(_key:integer ; _data:double);
  23.  
  24. var rightFlag : boolean; // флаг направления последнего перехода
  25. newElement, current, previous : Node; // узлы : новый элемент, текущий элемент и предыдущий
  26. begin
  27. rightFlag := true;
  28. // увеличиваем размер дерева на единицу
  29. size := size + 1;
  30. // создаем новый узел
  31. newElement := new Node();
  32. // иницилизиуем его данными из входных параметров
  33. newElement.data := _data;
  34. newElement.key := _key;
  35. // текущий узел это корень
  36. current := root;
  37. previous := nil;
  38. // далее будем искать нужное место для вставки, алгоритм похож на тот, что
  39. // используется в алгоритме поиска узла
  40.  
  41. if(root = nil) then // отдельный случай если у нас еще нет корня
  42. begin
  43. root := newElement; // новый элемент становится корнем
  44. currentElement := root; // текущий элемент корень
  45. end
  46. else
  47. begin
  48. // в этом цикле мы ищем нужное место для вставки
  49. while(current <> nil) do
  50. begin
  51. // предыдущий элемент становится равен текущему
  52. previous := current;
  53. if(_key > current.key) then
  54. begin
  55. current := current.right;
  56. rightFlag := true;
  57. end
  58. else begin
  59. current := current.left;
  60. rightFlag := false;
  61. end;
  62. end;
  63. // предыдущий элемент становится родителем
  64. newElement.parent := previous;
  65.  
  66. // вставляем новый элемент в нужное место либо вправо либо влево
  67. if(rightFlag) then previous.right := newElement
  68. else previous.left := newElement;
  69. current := newElement;
  70. end;
  71. end;
  72.  
  73. // процедура, которая переходит от текущего узла дерева к его левому ребенку
  74. // , если он существует
  75. procedure goLeft();
  76. begin
  77. if(currentElement.left <> nil) then
  78. currentElement := currentElement.left;
  79. end;
  80. // процедура, которая переходит от текущего узла дерева к его правому ребенку
  81. // , если он существует
  82. procedure goRight();
  83. begin
  84. if(currentElement.right <> nil) then
  85. currentElement := currentElement.right;
  86. end;
  87.  
  88. // процедура, которая переходит от текущего узла дерева к его родителю
  89. // если мы находимся в корне, то у корня нет родителя
  90. // и переход не осуществляется
  91. procedure goBack();
  92. begin
  93. if(currentElement.right <> root) then
  94. currentElement := currentElement.parent;
  95. end;
  96. // процедура возвращающее значение текущего узла
  97. function getCurrentValue():double;
  98. begin
  99. getCurrentValue := currentElement.data;
  100. end;
  101. // процедура переходящая от текущего узла к корню
  102. procedure goToRoot();
  103. begin
  104. currentElement := root;
  105. end;
  106.  
  107. // функция поиска значения по ключу в дереве
  108. // результат - обьект найденного узла, а также
  109. // значение текущего узла устанавливается в найденный узел
  110. function search(_key : integer):Node;
  111. var current : Node;
  112. begin
  113. // устанавлниваем стартовое текущего узла в корень
  114. current:= root;
  115. // до тех пор пока значение текущего узла не нул
  116. while(current <> nil) do
  117. begin
  118. // если наше искомое значение совпадает со значением узла
  119. if(current.key = _key) then
  120. begin
  121. // значение текущего узла устанавливается в найденный узел
  122. currentElement := current;
  123. // возвращаем обьект найденного узла
  124. search := current;
  125. // выходим из функции
  126. Exit;
  127. end
  128. // если наше поисковое значение меньше, чем значение узла
  129. // то идем налево
  130. else if (current.key > _key) then
  131. current := current.left
  132. // иначе идем направо
  133. else current := current.right;
  134. end;
  135. // возвращаем нул, как символ того,что ничего не найдено
  136. search := nil;
  137. end;
  138.  
  139. end;
  140. var tree:BinaryTreeClass;
  141.  
  142.  
  143.  
  144. begin
  145.  
  146. // создаем обьект - дерево и добавляем в него несколько элементов
  147. tree := new BinaryTreeClass();
  148. tree.add(10, 2.5);
  149. tree.add(16, 3.5);
  150. tree.add(20, 4.5);
  151. tree.add(8, 5.5);
  152. tree.add(17, 6.5);
  153. // пример поиска в дереве
  154. writeln(tree.search(17).data);
  155. writeln(tree.search(20).data);
  156. writeln(tree.search(55));
  157.  
  158. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement