树与二叉树基本操作ppt课件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

F
G
H
I
;.
6
二叉树的定义 树的度不超过2的有序树,非常重要的数据结构。
A
B
C
D
F
G
H
I
;.
7
二叉树的性质
性质1:二叉树第i层上至多有2^(i-1)个结点(i≥1) 性质2:深度为h的二叉树至多有2^h-1个结点。
满二叉树:各层结点均达到2^(i-1) 完全二叉树:除最后一层外,其余各层均满,且最后一层的结点集中在左边。
D
E
完全二叉树 理想平衡树
A
B
C
E
G
理想平衡树
10
二叉树的存储结构
1、线性存储 顺序存储二叉树,首先将二叉树按照完全二叉树中对应
的位置进行标号,然后,以每个结点的标号为下标,将对 应的值存储到一个一维数组中。
i 12345678911 01
T ABCDF
G
HI
可见:完全二叉树用顺序存储极好,但一般二叉 树容易造成空间浪费。
end;
end;
;.
13
2.删除二叉树
Procedure dis(Var bt:tree); begin
If bt<>Nil then begin dis(bt^.lchild); {删左子树} dis(bt^.rchild); {删右子树} dispose(bt); {释放父结点} end;
end;
{按先序次序输入二叉树中结点的值,
begin
生成二叉树的单链表存储结构}
read(ch);
if ch=‘’ Then bt:=Nil
{’’表示空树}
else begin
New(bt);
{建根结点}
bt^.data:=ch;
pre_crt(bt^.lchild); {建左子树}
pre_crt(bt^.rchild); {建右子树}
给完全二叉树的结点从上到下,从左到右依次标号,则完全二叉树的标号 性质有: 性质1:若i<=(n div 2),则i为分支结点,否则为叶子结点。 性质2:在N个结点的完全二叉树中,若n为奇数,则,所有分支都有左右儿子,若n为偶数,则
n/2的结点只有左儿子,没有右儿子。其他结点有左右儿子。 性质3:标号为i的结点,其左儿子为2i,右儿子为2i+1 性质4:若标号为i的结点有双亲,则i>1且其双亲结点为(i div 2)
数据结构 树及基本操作
;.
1
树的基本概念
空树:不含结点的树。 非空树:至少含一个节点的树。只有一个根结 点,其余结点分为m棵互不相交的子树,每棵子 树又都是一棵树。(递归定义)
A
B
C
D
E
F
G
H
I
;.
2
树的二元组定义
A
B
C
D
E
F
G
H
I
K={A,B,C,D,E,F,G,H,I} R={<A,B>,<A,C>,<B,D>,<B,E>,<B,F>,<C,G>,<F,H>,<F,I>}
;.
8
二叉树的性质
完全二叉树的深度性质: N个结点的完全二叉树,其深度为trunc(log2n)+1
;.
9
理想平衡树:二叉树中,除最后一层外,其余 层都是满的,则称此树为理想平衡树。
满二叉树是特殊的完全二叉树,完全二叉树是 特殊的理想平衡树。
A
B
C
A
B
C
D
EFG
满二叉树 完全二叉树 理想平衡树
;.
data=elementtype; left,right:integer; end; Var a:array[1..maxl]of tnode;
12345678 DI B DGA F CH L03002800
D
F
G
R0 6 0 0 7 1 4 0
存放的顺序是任意的
பைடு நூலகம்
H
I
;.
12
1.建立一棵二叉树
Procedure pre_crt(Var bt:tree);
end; write(‘)’); end; End;
;.
23
求二叉树的深度
若二叉树空,则深度为0,否则其深度=子树 的最大深度+1。 Function depth(bt:bitree):integer; Begin
if bt=nil then depth:=0; depth1:=depth(bt^.lchild); depth2:=depth(bt^.rchild); if depth1>depth2 then depth:=depth1+1 else depth:=depth2+1; End;
● Begin
● Write(‘(’);print(bt^.lchild);
● If bt^.rchild<>Nil Then Write(‘,’);
● print(bt^.rchild);Write(‘)’);
● End;

End;
● End;
;.
17
由广义表生成二叉树
A
该二叉树的广义表表示:
B
End; 3、后续遍历:左右根 Procedure preorder(bt:bitree); Begin
if bt<>nil then begin preorder(bt^.lchild); preorder(bt^.rchild); visit(bt^); end;
End;
;.
22
输出二叉树
如何将一棵二叉树输出为广义表的形式。 Procedure print(bt:bitree); Begin
;.
14
3.插入一个结点到二叉树中
procedure insert(var bt:tree;n:Integer);
begin
if bt=Nil then begin
{空树,则为根结点}
new(bt);
bt^.data:=n;
bt^.lchild:=Nil;
bt^.rchild:=Nil;
end
else If n<bt^.data Then insert(bt^.lchild,n) {<,左}
Else find:=bt; End;
;.
16
5.用嵌套括号表示法输出二叉树
● Procedure print(bt:tree);
● Begin
● If bt<>Nil Then Begin
● Write(bt^.data);
● If (bt^.lchild<>nil) Or (bt^.rchild<>nil) Then
孩子结点:某结点的后继叫该结点的孩子。
双亲结点(父结点):某结点的前驱叫该结点的父亲。
显然,根结点没有双亲,叶结点没有孩子。
结点的层数:根为第一层,其儿子为第二层,孙子为第三 层,以此类推。
树的深度(高度):结点的最大层数。
森林:互不相交的树的集合。对于每个分支结点,其子树 的集合就是森林。
A
B
C
E
if bt<>nil then write(bt^.data); if (bt^.lchild<>nil) or(bt^.rchild<>nil) then begin
write(‘(’); print(bt^.lchild); if bt^.rchild<>nil then
begin write(‘,’); print(bt^rchild);
;.
27
;.
19
二叉树的运算
1、二叉树的遍历 2、二叉树的输出 3、求二叉树的深度
;.
20
二叉树的遍历
● 二叉树常用的存储结构 type bitree=^node node=record data :datatype; lchild,rchild:bitree; end;
1、先序遍历:根左右 Procedure preorder(bt:bitree); Begin
;.
24
例:二叉树的遍历问题
● [问题描述] ● 输入一棵二叉树的先序和中序遍历序列,输出其后序遍历序列。 ● [输入格式] ● 输入文件为tree.in,共两行,第一行一个字符串,表示树的先序遍历,第二行一个字
符串,表示树的中序遍历。树的结点一律用小写字母表示。 ● [输出格式] ● 输出文件为tree.out,仅一行,表示树的后序遍历序列。 ● [样例输入] ● abdec ● dbeac ● [样例输出] ● debca
case ch of ‘A’..’Z’:新建节点,值域赋为ch,左右子树指针置空;若为首结点,则是根节点,否 则若k=1,则当前节点为栈顶节点的左子树,否则k=2则将当前节点当做栈顶节点的右子 树。 ‘(’:当前节点插入栈顶,k=1; ‘,’ :k=2; ‘)’:栈顶元素出栈;
end; 输入下一字符 end; End;
if bt<>nil then begin visit(bt^); preorder(bt^.lchild); preorder(bt^.rchild); end;
End;
;.
21
二叉树的遍历
2、中序遍历:左根右 Procedure preorder(bt:bitree); Begin
if bt<>nil then begin preorder(bt^.lchild); visit(bt^); preorder(bt^.rchild); end;
;.
25
例如已知一棵二叉树的先序遍历结果为ABCDEFG,中序遍历结果为CBEDAFG。构造出这 棵二叉树的步骤如图所示:
;.
26
[程序]
● Program tree_1(Input, Output); ● Var s1, s2 : String; ● Procedure try(l1, r1, l2, r2 : Integer); {递归、后序} ● Var m : Integer; ● Begin ● m := pos(s1[l1], s2); {求l1的第一个字符在l2中的位置 } ● If m > l2 Then try(l1 + 1, l1 + m - l2, l2, m - 1); ● m=l2时无左半边 {遍历第m个的左半边} ● If m < r2 Then try(l1 + m - l2 + 1, r1, m + 1, r2); ● m=l2时无右半边 {遍历第m个的右半边} ● Write(s1[l1]) ● End; ● Begin {main} ● Readln(s1);Readln(s2); ● try(1, Length(s1), 1, Length(s2)); ● Writeln ● End.
A
B
C
D
F
G
H
I
;.
11
二叉树的存储结构
2、动态链接存储,三个域的节点:
left
data
right
或者再添加一个指向父亲的指针。
Type pnode=^tnode; tnode=record data:elementtype;
A
left,right:pnode;
end;
B
C
3、静态链接存储 Type tnode=record
4、若遇到逗号,则表明左子树以处理完,标记将要处理的子节点为 右节点(k=2).
5、若遇到右括号,则表明子树处理完毕,则退栈。
这样处理直至结束,通常用“@”表明广义表结束。
C G
I
;.
18
算法伪代码:
Procedure buildtree; Begin
输入一个字符ch while ch<>’@’ do begin
A(B,C)
A(B(D,F),C(,G))
A(B(D,F(H,I)),C(,G)) 算法思想:
D
F
1、依次输入广义表中每个字符。
2、若遇到字母,则为其新建一个结点,若是第一个字母,则作为根 节点,若是孩子节点,则将其连接到它的父节点上。
H
3、若遇到左括号,则先将其前面字母的指针进栈,以便后面的结点 连接到父节点上。并记下将要插入节点的孩子为左孩子(k=1)
;.
3
例2、表达式树 a*b+(c-d/e)*f
+
*
*
a
b
-
f
c
/
d
e
;.
4
树的表示方法:
1、树形图 2、二元组 3、目录结构 4、集合图 5、凹入表 6、广义表
;.
5
树的基本术语
结点的度:结点的儿子数(注意不包括孙子)
树的度:树中所有结点的度的最大值
分支结点(非终端结点):度大于0的结点
D
叶子结点(终端结点):度为0的结点
else If n>bt^.data then
insert(bt^.rchild,n); {>,右}
end;
;.
15
4.在二叉树中查找一个数,找到返回该结点,否则返回nil
Function find(bt:tree;n:Integer):tree; Begin
If bt=Nil Then find:=Nil Else If n<bt^.data Then find(bt^.lchild,n) Else If n>bt^.data Then find(bt^.rchild,n)
相关文档
最新文档