您的位置:首页 > 编程语言 > Delphi

Delphi中二叉树的学习

2012-01-08 23:12 344 查看
二叉树是树结构中的一种,任意树都能很容易的转换成相应的二叉有序树,二叉树的存储和算法相对简单,存储效率高。二叉树是n(n>=0)个结点的有限集合,它或者为空集(n=0),或者是由一个根结点和两个互不相交的分别称为根的左子树和右子树组成。二叉树是由根结点、左子树、右子树三个基本单元,相应的遍历算法也有三种,一下是根据C语言改编的Delphi的二叉树实现及遍历算法。

打开Delphi,选择File-new-other-Console Application,新建一个控制台应用程序。源代码如下:

program Btree;

{$APPTYPE CONSOLE}

uses

SysUtils;

type

Ptree=^Ttree;

Ttree=record

data:Char;

lchild,rchild:Ptree;

end;

function CreateTree():Ptree; //按前序遍历次序创建二叉树

var

ch:Char;

root:Ptree;

begin

Writeln('Please input the data,''$'' is the end.');

Readln(ch);

if ch='$' then

begin

Result:=nil;

Exit;

end

else

begin

New(root);

root^.data:=ch;

root^.lchild:=CreateTree();

root^.rchild:=CreateTree();

Result:=root;

end;

Writeln('OK!');

end;

procedure preorder(root:Ptree); //前序遍历二叉树根左右

begin

if Assigned(root) then

begin

Write(root^.data);

preorder(root^.lchild);

preorder(root^.rchild);

end;

end;

procedure inorder(root:Ptree); //中序遍历二叉树左根右

begin

if Assigned(root) then

begin

inorder(root^.lchild);

Write(root^.data);

inorder(root^.rchild);

end;

end;

procedure postorder(root:Ptree);//后序遍历二叉树左右根

begin

if Assigned(root) then

begin

postorder(root^.lchild);

postorder(root^.rchild);

Write(root^.data);

end;

end;

function treedepth(root:Ptree):Integer; //二叉树的深度

var

depth,dl,dr:integer;

begin

if not Assigned(root) then

depth:=0

else

begin

dl:=treedepth(root^.lchild); //获取左子树深度

dr:=treedepth(root^.rchild); //获取右子树深度

if dl>dr then

depth:=dl+1

else

depth:=dr+1;

end;

Result:=depth;

end;

function numofleaf(root:Ptree):Integer; //二叉树叶子数

var

num,num1,num2:Integer;

begin

if Assigned(root) then

begin

if (not Assigned(root^.lchild)) and (not Assigned(root^.rchild)) then

num:=1

else

begin

num1:=numofleaf(root^.lchild); //获取左子树叶子数

num2:=numofleaf(root^.rchild); //获取右子树叶子数

num:=num1+num2;

end;

end

else

num:=0;

Result:=num;

end;

var

root:Ptree;

i:Integer;

begin

Writeln('Create a btree');

Writeln('Please input nodes of tree');

root:=CreateTree();

if root=nil then

Writeln('This is an empty tree!')

else

begin

Writeln('1.The preorder traverse ');

Writeln('2.The inorder traverse ');

Writeln('3.The postorder traverse ');

Writeln('Please choose a kind of order');

Readln(i);

case i of

1:preorder(root);

2:inorder(root);

3:postorder(root)

else

Writeln('error!');

end;

end;

Writeln;

Writeln('The depth of the btree is ',treedepth(root));

Writeln('The leafnumber of the btree is ',numofleaf(root));

Readln;

end.

运行后效果如下所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: