fork download
  1. type
  2. TInfo : Integer;
  3.  
  4. PNode ^= TNode;
  5. TNode = record
  6. Info : TInfo;
  7. Left, Right : PNode;
  8. end;
  9.  
  10. procedure createNode(var N : PNode; I : TInfo); // Создание и инициализация элемента
  11. begin
  12. new(N);
  13. N^.Info := X;
  14. N^.Left := NIL;
  15. N^.Right := NIL;
  16. end;
  17.  
  18. procedure Insert(Root : PNode; X : TInfo); // Вставка элемента
  19. begin
  20. If Root = NIL then createNode(Root, X) // Создаем новый узел дерева
  21. else
  22. with Root^ do begin
  23. if Info < X then Insert(Right, X)
  24. else
  25. if Info > X then Insert(Left, X)
  26. else {Действий, производимые в случае повторного внесения элемента в дерево}
  27. end;
  28. end;
  29.  
  30. function Find(Root : PNode; X : TInfo); // Поиск элемента. Возвращает адрес узла с найденным элементом; если элемент в дереве не найден, возвращается nil)
  31. begin
  32. if Root := NIL then Find := NIl
  33. else
  34. If X = Root^.Info then Find := Root
  35. else
  36. If X < Root^.Info then Find := Find(Root^.Left, X)
  37. else Find := Find(Root^.Right, X);
  38. end;
  39.  
  40. function DeleteMin(Root : PNode): TInfo; // Удаляет наименьший элемент непустого дерева Root и возвращает значение удаленного элемента
  41. var WasRoot: PNode;
  42. begin
  43. if Root^.Left = nil then begin
  44. DeleteMin := Root^.Info; // результат функции
  45. WasRoot := Root; // Запоминаем узел для последующего удаления
  46. Root := Root^.Right; // Двигаемся дальше
  47. Dispose(WasRoot); // Удаляем бывший корень
  48. end
  49. else {узел Root имеет левого "сына"}
  50. DeleteMin := DeleteMin(Root^.Left);
  51. end;
  52. end;
  53.  
  54. procedure Remove(Root : PNode; X : TInfo); // Процедура удаления элемента
  55. var WasNext: PNode;
  56. begin
  57. if Root <> NIL then
  58. if X < Root^.Info then Remove(Root^.Left, X)
  59. else
  60. if X > Root^.Info then Remove(Root^.Right, X)
  61. else
  62. if (Root^.Left = NIL) and (Root^.Right = NIL) then begin // Нет сыновей
  63. Dispose(Root);
  64. Root := NIL;
  65. end
  66. else if Root^.Left = NIL then begin
  67. WasNext := Root^.Right;
  68. Dispose(Root);
  69. Root := WasNext;
  70. end
  71. else if Root^.Right = NIL then begin
  72. WasNext := Root^.Left;
  73. Dispose(Root);
  74. Root := WasNext;
  75. end
  76. else Root^.Info := DeleteMin(Root^.Right); // У удаляемого элемента есть оба "сына"
  77. end;
  78.  
  79. procedure PreOrder(Root: PNode); // Прямой обход
  80. begin
  81. If Root = NIL then break;
  82. Write(Root^.Info);
  83. PreOrder(Root^.Left);
  84. PreOrder(Root^.Right);
  85. end;
  86.  
  87. procedure PostOrder(Root: PNode); // Обратный обход
  88. begin
  89. If Root = NIL then break;
  90. PostOrder(Root^.Left);
  91. Write(Root^.Info);
  92. PostOrder(Root^.Right);
  93. end;
  94.  
  95. procedure ReverseOrder(Root: PNode); // Концевой обход
  96. begin
  97. If Root = NIL then break;
  98. ReverseOrder(Root^.Left);
  99. ReverseOrder(Root^.Right);
  100. Write(Root^.Info);
  101. end;
  102.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
Free Pascal Compiler version 2.6.4+dfsg-4 [2014/10/14] for i386
Copyright (c) 1993-2014 by Florian Klaempfl and others
Target OS: Linux for i386
Compiling prog.pas
prog.pas(2,8) Fatal: Syntax error, "=" expected but ":" found
Fatal: Compilation aborted
Error: /usr/bin/ppc386 returned an error exitcode (normal if you did not specify a source file to be compiled)
stdout
Standard output is empty