Delphi二叉树链表的建立及四种遍历方法
2023-09-11 14:15:13 时间
program BiTree;
{$APPTYPE CONSOLE}
uses
SysUtils,Contnrs;
type
{二叉树定义}
PBiTree=^TBiTree;
TBiTree = record
Data :Char; //数据
lChild:PBiTree; //左孩子指针
rChild:PBiTree; //右孩子指针
end;
//按前序遍历创建二叉树
function CreateTree(): PBiTree;
var
ch: Char;
root: PBiTree;
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: PBiTree);
begin
if Assigned(root) then
begin
Write(root^.Data);
preorder(root^.lChild);
preorder(root^.rChild);
end;
end;
//中序遍历二叉树左根右 (由根开始,由左到右,第二次到达输出)
procedure InOrder(root: PBiTree);
begin
if Assigned(root) then
begin
inorder(root^.lChild);
Write(root^.Data);
inorder(root^.rChild);
end;
end;
//后序遍历二叉树左右根 (由根开始,由左到右,第三次到达输出)
procedure PostOrder(root: PBiTree);
begin
if Assigned(root) then
begin
postorder(root^.lChild);
postorder(root^.rChild);
Write(root^.Data);
end;
end;
//二叉树深度计算
function TreeDepth(root: PBiTree): 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: PBiTree): 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;
//层序遍历二叉树,用到队列
procedure LevelOrder(root: PBiTree);
var
Queue: TQueue;
BiTreeDB:PBiTree;
begin
if Assigned(root) then
begin
Queue:=TQueue.Create;
Queue.Push(root); //根节点进队列
while Queue.Count>0 do //队列不为空判断
begin
New(BiTreeDB);
BiTreeDB:=Queue.Peek;
Write(BiTreeDB^.Data); //打印节点数据
if BiTreeDB.lChild <>nil then Queue.Push(BiTreeDB.lChild); //如果有左孩子,入队列
if BiTreeDB.rChild <>nil then Queue.Push(BiTreeDB.rChild); //如果有右孩子,入队列
Queue.Pop; //已经遍历过的节点出队列
end;
Dispose(BiTreeDB);
end;
end;
var
root: PBiTree;
i: Integer;
begin
Writeln('Please input Nodes of the BinTree,if input # is mean the child is empty.');
root := CreateTree();
if root = nil then
Writeln('This is an empty tree!')
else
begin
Writeln('1.前序遍历二叉树');
PreOrder(root);
Writeln;
Writeln('2.中序遍历二叉树');
InOrder(root);
Writeln;
Writeln('3.后序遍历二叉树');
PostOrder(root);
Writeln;
Writeln('4.层序遍历二叉树');
LevelOrder(root);
Writeln;
end;
Writeln;
Writeln('二叉树深度: ', TreeDepth(root));
Writeln('二叉树叶子数: ', NumofLeaf(root));
Readln;
end.
测试二叉树模型图:
程序运行结果图:
相关文章
- Java实现二叉树及相关遍历方式
- 【算法】【二叉树模块】在二叉树中找到累加和为指定值的最长路径长度
- 【算法】【链表模块】二叉树空间复杂度为O(1)的遍历方法(Morris算法)
- 【BZOJ1864】[Zjoi2006]三色二叉树 树形DP
- 力扣-有序链表转平衡二叉树
- LeetCode 94. 二叉树的中序遍历
- LeetCode426之 将二叉搜索树转化为排序的双向链表(相关话题:双向链表,二叉树中序)
- 【刷题笔记】之牛客面试必刷TOP101(二叉树的前.中.后.层序遍历+按之字形顺序打印二叉树+二叉树的最大深度+二叉树中和为某一值的路径(一)+二叉搜索树与双向链表+判断是不是二叉搜索树)
- 【leetcode】114: 二叉树展开为链表
- [LeetCode] Print Binary Tree 打印二叉树
- [LeetCode] 545. Boundary of Binary Tree 二叉树的边界
- [CareerCup] 4.4 Create List at Each Depth of Binary Tree 二叉树的各层创建链表
- [LeetCode] 114. Flatten Binary Tree to Linked List 将二叉树展开成链表
- 二叉树解决折纸方向问题
- PAT归纳总结——关于二叉树的一些总结