|
線形リストは,Top(あるいは First)から矢印をたどっていくと,一本の線のようにつながっている.
今度は,木のように根(Root)から始まってときどき枝分かれしてつながっている. 一般には3つ以上枝分かれすることもある木を考えるが,ここでは枝分かれは2つしかしないものとする. すなわち二分木(Binary Tree)である.
|
下記のプログラムをよく読んで,理解しましょう.
program Tree1;
(* 〜 〜 *)
(* oYo *)
(* A *)
{$APPTYPE CONSOLE}
uses SysUtils;
type
PTree = ^TTree; // 木を指すポインタ
TTree = record
Upper : PTree; // 上の枝(部分木)を指す
Point : Integer; // 点数
Lower : PTree; // 下の枝(部分木)を指す
end;
var
Root : PTree; // 根(木全体を指す)
procedure TreeWoKaku(P : PTree; Eda : String);
{木を書く}
procedure EdaWoKaku(Eda : String);
{枝を書く}
var
Depth : Integer;
K : Integer;
begin
Depth := Length(Eda);
for K := 2 to Depth do
if Eda[K-1] = Eda[K]
then Write(' ')
else Write(' │');
case Eda[Depth] of
'U' : Write(' ┌');
'L' : Write(' └');
end;
end; {EdaWoKaku}
begin
if P = Nil // 枝の先端か?
then begin // yes
{
EdaWoKaku(Eda); // 途中の枝を書く
WriteLn; //
}
end
else begin // yes
TreeWoKaku(P^.Upper,Eda+'U'); // 上の部分木を書く
EdaWoKaku(Eda); // 途中の枝を書く
Write(P^.Point); // 点数を書く
WriteLn('┤'); //
TreeWoKaku(P^.Lower,Eda+'L'); // 下の部分木を書く
end;
end; {TreeWoKaku}
procedure TensuuWoYondeTreeWoTsukuru;
{点数を読んで木を作る}
var
PNew : PTree; // 新しい節を指す
procedure TreeNiTsuika(var P : PTree);
{P が指す部分木に PNew が指している新しい節を追加する}
begin
if P = Nil // 枝の先端か?
then begin // yes
P := PNew; // そこにつなげる
end
else begin // no
if PNew^.Point > P^.Point // その点数より上か?
then TreeNiTsuika(P^.Upper) // yes 上の部分木に追加
else TreeNiTsuika(P^.Lower) // no 下の部分木に追加
end;
end; {TreeNiTsuika}
var
Tensuu : Integer;
begin
WriteLn('2桁の数を入れてください');
WriteLn('それ以外の数を入れると終わります');
Root := Nil; // 何も指さない(空ツリー)
Write('点数 ? '); // 最初のデータを読む
ReadLn(Tensuu);
while Tensuu in [10..99] do // 点数が2桁の数なら繰り返す
begin
New(PNew); // 新しい節を作る
PNew.Upper := Nil; // 上の枝はまだない
PNew.Point := Tensuu;
PNew.Lower := Nil; // 下の枝もまだない
TreeNiTsuika(Root); // 木に追加する
WriteLn;
TreeWoKaku(Root,'L'); // 木を書く
WriteLn;
Write('点数 ? '); // 次のデータを読む
ReadLn(Tensuu);
end;
end; {TensuuWoYondeTreeWoTsukuru}
begin
TensuuWoYondeTreeWoTsukuru;
end.
|