I don't see why you are making these methods of a GUI form because they have nothing to do with GUI. These should be standalone procedures.
The initialisation function could be written simply like this:
function NewNode(key: Integer; parent: PNode): PNode;
begin
New(Result);
Result.key := key;
Result.right := nil;
Result.left := nil;
Result.parent := parent;
end;
As for the insertion, that would normally be done like this:
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;
This code assumes that the tree is non-empty. So, you'll need an outer layer that detects that the head node pointer is nil, and initialises it. Perhaps like this:
procedure Add(var head: PNode; key: Integer);
begin
if Assigned(head) then
InsertNode(head, key)
else
head := NewNode(key, nil)
end;
If you want to avoid recursion that's easy enough:
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;
And then it's easy to merge in the separate Add function.
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;