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.
运行后效果如下所示:
打开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.
运行后效果如下所示:
相关文章推荐
- N个节点构成二叉树个数计算 -- JAVA 数据结构学习
- Delphi学习笔记三 运算符
- delphi 最专业的学习论坛,全英文哦,可以练英文阅读 http://www.delphigroups.info/forum/2/
- 二叉树学习之堆排序
- Delphi的学习笔记十二——方法1
- 从Delphi转向VC系列学习一:C++基础知识
- Delphi学习之函数参数修饰中的var 、out和const
- 《剑指Offer》学习笔记--面试题39:二叉树的深度
- 学习Delphi资源文件
- c++学习笔记—二叉树基本操作的实现
- Delphi学习之Class-2
- delphi学习笔记--ADO数据库连接组件TADOConnect
- delphi BLE 学习
- 今天开始学习DELPHI 2006 ECO
- 二叉树学习
- Delphi面向对象学习随笔六:接口(转)
- [学习笔记]二叉树的遍历
- 我的Delphi学习历程(下)
- 算法学习笔记 二叉树和图遍历—深搜 DFS 与广搜 BFS
- 学习delphi6之菜鸟级别