BTree.pas 3.2 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.