Delphi中的二叉树实现

moh*_*kad 1 delphi tree pointers

首先我写了这个记录:

type
  PNode = ^Tree;
  Tree = record
  key : Integer;
  left,right : PNode;
end;

function TForm1.TreeInit(key: Integer): PNode;
var
  Head : PNode;
begin

Head := nil;
New(Head);

Head.key   := key;
Head.right := nil;
Head.left  := nil;

Result := Head;
end;
Run Code Online (Sandbox Code Playgroud)

一切都很好.然后我将Parent添加到Structure:

type
  PNode = ^Tree;
  Tree = record
  key : Integer;
  left,right : PNode;
  parent     : PNode;
end;
Run Code Online (Sandbox Code Playgroud)

现在我不知道如何以及在哪里初始化父(特别是在插入函数中)?

插入功能:

function TForm1.NodeInsert(Head: PNode; key: Integer): PNode;
begin

if Head = nil then
begin
Result := TreeInit(key);
end else
begin

if (Head.key > key) then
  Head.left := NodeInsert(Head.left, key)
else
  Head.right := NodeInsert(Head.right,key);

Result := Head;

end;

end;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 9

我不明白你为什么要制作这些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;
Run Code Online (Sandbox Code Playgroud)

至于插入,通常会这样做:

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;
Run Code Online (Sandbox Code Playgroud)

此代码假定树是非空的.因此,您需要一个外层来检测头节点指针是否为nil,然后对其进行初始化.也许是这样的:

procedure Add(var head: PNode; key: Integer);
begin
  if Assigned(head) then
    InsertNode(head, key)
  else
    head := NewNode(key, nil)
end;
Run Code Online (Sandbox Code Playgroud)

如果你想避免递归这很容易:

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;
Run Code Online (Sandbox Code Playgroud)

然后在单独的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;
Run Code Online (Sandbox Code Playgroud)