GUI とは何の関係もないので、GUI フォームのこれらのメソッドを作成する理由がわかりません。これらはスタンドアロンの手順である必要があります。
初期化関数は、次のように簡単に記述できます。
function NewNode(key: Integer; parent: PNode): PNode;
begin
New(Result);
Result.key := key;
Result.right := nil;
Result.left := nil;
Result.parent := parent;
end;
挿入に関しては、通常は次のように行われます。
procedure InsertNode(node: PNode: key: Integer);
begin
if key < node.key then
if Assigned(node.left) then
InsertNode(node.left, key)
else
node.left := NewNode(key, node)
else
if Assigned(node.right) then
InsertNode(node.right, key)
else
node.right := NewNode(key, node)
end;
このコードは、ツリーが空でないことを前提としています。そのため、ヘッド ノード ポインターが nil であることを検出して初期化する外部レイヤーが必要になります。おそらく次のようになります。
procedure Add(var head: PNode; key: Integer);
begin
if Assigned(head) then
InsertNode(head, key)
else
head := NewNode(key, nil)
end;
十分に簡単な再帰を回避したい場合:
procedure InsertNode(node: PNode: key: Integer);
begin
while True do
if key < node.key then
if Assigned(node.left) then
node := node.left
else
begin
node.left := NewNode(key, node);
exit;
end
else
if Assigned(node.right) then
node := node.right
else
begin
node.right := NewNode(key, node);
exit;
end
end;
そして、別の Add 関数でマージするのは簡単です。
procedure InsertNode(var head: PNode: key: Integer);
var
node: PNode;
begin
if not Assigned(head) then
begin
head := NewNode(key, nil);
exit;
end;
node := head;
while True do
if key < node.key then
if Assigned(node.left) then
node := node.left
else
begin
node.left := NewNode(key, node);
exit;
end
else
if Assigned(node.right) then
node := node.right
else
begin
node.right := NewNode(key, node);
exit;
end
end;