BTree.pas 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. Uses CRT;
  2. Type
  3. UT = char; {Пользовательский тип}
  4. PBTree = ^TBTree; {Указатель на дерево}
  5. TBTree = record {Просто дерево}
  6. info : UT; {Значение}
  7. count: word; {Количество}
  8. Left : PBTree; {Левая ветвь}
  9. Right: PBTree; {Правая ветвь}
  10. end;
  11. Function NewChild(info:UT) : PBtree; {Функция создания новой ветви}
  12. var
  13. ne : PBTree; {Указатель на результат}
  14. begin
  15. New(ne);
  16. Ne^.info := Info; {Заполняем зн-е}
  17. Ne^.Left := nil;
  18. Ne^.Right := nil;
  19. Ne^.count := 1; {Кол-во - 1}
  20. NewChild := ne;
  21. end; {NewChild}
  22. {---------------------------------}
  23. Procedure DelBranch(br:PBTree); {Удаление ветви, вмести с детьми}
  24. begin
  25. if br^.left <> nil then DelBranch(br^.left); {Если есть левый ребенок -
  26. удаляем его}
  27. if br^.right <> nil then DelBranch(br^.right);{А если есть и правый - и
  28. его тоже!}
  29. Dispose(br); {Собственно удаление}
  30. end;{DelBranch}
  31. {---------------------------------}
  32. Procedure SetLRootRInfo(info:UT;Br:PBTree); {Добавление нового зн-я на
  33. на ветвь}
  34. begin
  35. if info < Br^.info then {Посылаем на лево}
  36. begin
  37. if (Br^.Left=nil) then Br^.Left := NewChild(info) {Если никого - вешаем}
  38. else SetLRootRInfo(info,BR^.Left); {Иначе - спускаем на лево}
  39. end
  40. else {А если такой-же - увеличиваем кол-во}
  41. if (info=Br^.info) then inc(Br^.count)
  42. else {Значит оно - справа}
  43. begin
  44. if (Br^.Right=nil) then {Если никого - вешаем направо}
  45. Br^.Right := NewChild(info)
  46. else SetLRootRInfo(info,BR^.Right); {Иначе - спускаем на право}
  47. end;
  48. end;{SetLRootRInfo}
  49. {---------------------------------}
  50. Function MakeLRootRTree(st:string;count:word):PBTree;
  51. {Создание двоичного дерева для поиска}
  52. var
  53. ret : PBTree;
  54. pos : byte;
  55. Begin
  56. ret := NewChild(st[1]);
  57. for pos := 2 to count do SetLRootRInfo(st[pos],ret);
  58. MakeLRootRTree := ret;
  59. End; {MakeLRootRTree}
  60. {---------------------------------}
  61. var
  62. h : word; {Глобальная переменная - номер уровня}
  63. Procedure FindInfo(info:UT;Br:PBTree); {Поиск зн-я в дереве, с подсчетом H}
  64. begin
  65. if (Br<>nil) then begin
  66. if (info<Br^.Info) then begin inc(h); FindInfo(info,Br^.Left) end
  67. else if (info>Br^.Info) then begin inc(h); FindInfo(info,Br^.Right) end;
  68. end
  69. else h := 0;
  70. end;
  71. Var
  72. test : string;
  73. BTree : PBTree;
  74. ch : char;
  75. BEGIN
  76. WriteLn('Введите массив для создания двоичного дерева поиска методом Left->Root->Right');
  77. ReadLn(test);
  78. BTree := MakeLRootRTree(test,Length(test));
  79. h := 1;
  80. WriteLn('Введите символ для поиска по дереву: ');
  81. ch := ReadKey;
  82. FindInfo(ch,BTree);
  83. DelBranch(BTree);
  84. if (h<>0) then
  85. WriteLn('Символ ''',ch,''' найден на ',h,'-ом уровне')
  86. else
  87. WriteLn('Символ ''',ch,''' не найден');
  88. ReadKey;
  89. END.