第四章树与树的表示(一)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
完全二叉树(Complete Binary Tree):如果深度为k,由n个结点的二叉树, 当且仅当其每一个结点都与深度为k的满二叉树中编号从1到n的结点一一对应, 该二叉树称为完全二叉树。
或深度为k的满二叉树中编号从1到n的前n个结点构成了一棵深度为k的完 全二叉树。
其中 2k-1 ≦ n≦2k-1 。
11个元素的二分查找判定树
判定树上每个结点需要的查找次数刚好
6
为该结点所在的层数;
查找成功时查找次数不会超过判
3
9
定树的深度
1
4
7
10
n个结点的判定树的深度 为[log2n]+1.
ASL = (4*4+4*3+2*2+1)/11 = 3
2
5
8
11
二分查找的启示?
4.2树的定义
树(Tree): n(n≥0)个结点构成的有限集合。 当n=0时,称为空树; 对于任一棵非空树(n> 0),它具备以下性质:
什么是树
客观世界中许多事物存在层次关系
人类社会家谱 社会组织结构 图书信息管理
什么是树
分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找
如何实现有效率的查找?
查找(Searching)
查找:根据某个给定关键字K ,从集合R中找出关键字与K相同的记录
静态查找:集合中记录是固定的 没有插入和删除操作,只有查找
KL
M
B
E F
K L
A
C
G
H
M
D
I
J
儿子-兄弟表示法
Element FirstChild NextSibling
A BC D E F G HIJ
KL
M
A
N
B
C
D
N
E
F G HI J
NN NN
N
NN
K
L
M
N
NN
NN
A
N
45
B
C
D
N
E FG HI J
NN NN
N NN
KL
M
N
NN
NN
Element
树与非树?
A
B
C
D
E F GH
A
B
C
D
E F GH
A
B
C
D
E F GH
子树是不相交的; 除了根结点外,每个结点有且仅有一个父结点; 一棵N个结点的树有N-1条边。
D IJ K M
树的一些基本术语
1. 结点的度(Degree):结点的子树个数 2. 树的度:树的所有结点中最大的度数 3. 叶结点(Leaf):度为0的结点 4. 父结点(Parent):有子树的结点是其子树
常用的遍历方法有: void PreOrderTraversal( BinTree BT ):先序----根、左子树、右子树; void InOrderTraversal( BinTree BT ): 中序---左子树、根、右子树; void PostOrderTraversal( BinTree BT ):后序---左子树、右子树、根 void LevelOrderTraversal( BinTree BT ):层次遍历,从上到下、从左到右
,
二叉树的抽象数据类型定义
类型名称:二叉树 数据对象集:一个有穷的结点集合。
若不为空,则由根结点和其左、右二叉子树组成。
操作集: BT BinTree, Item ElementType,重要操作有: 1、Boolean IsEmpty( BinTree BT ): 判别BT是否为空; 2、void Traversal( BinTree BT ):遍历,按某顺序访问每个结点; 3、BinTree CreatBinTree( ):创建一个二叉树。
5 16 39 45 51 98 100 202 226 321 368 444 501 1 2 3 4 5 6 7 8 9 10 11 12 13
1、left = 1, right = 13; mid = (1+13)/2 = 7: 2、left = mid+1=8, right = 13; mid = (8+13)/2 = 10: 3、left = mid+1=11, right = 13; mid = (11+13)/2 = 12:
1
A
2
3
B
4
5
C
6
7
D
E
F
G
8 9 10 11 12 13 14 15
H I J K L MN O
完全二叉树 (Complete Binary Tree)
有n个结点的二叉树,对树中结点按
从上至下、从左到右顺序进行编号, 编号为i(1 ≤ i ≤ n)结点与满二叉树 中编号为 i 结点在二叉树中位置相同
树的根结点。
结点(序号为 i )的左孩子结点的序
Left
Right
Left
二叉树
Right
4.2 二叉树及存储结构
二叉树(Binary tree)是n(n≥0)个结点的有限集合。 若n=0时称为空树,否则: ⑴ 有且只有一个特殊的称为树的根(Root)结点; ⑵ 若n>1时,其余的结点被分成为二个互不相交的子集T1,T2, 分别称之为左、右子树,并且左、右子树又都是二叉树。
100 < 444; 321 < 444; 查找结束;
二分查找算法
int BinarySearch ( StaticTable * Tbl, ElementType K) { /*在表Tbl中查找关键字为K的数据元素*/
int left, right, mid, NoFound=-1;
left = 1; right = Tbl->Length;
树中有一个称为“根(Root)”的特殊结点,用 r 表示;
其余结点可分为m(m>0)个互不相交的有限集T1,T2,... ,Tm,其 中每个集合本身又是一棵树,称为原来树的“子树(SubTree)”
A
B
C
D
E
B
C
D
E
FG
H
IJ K
F GH I J K
L
M
L
M
(a) 树T
(b) 子树TA1 (c) 子树TA2 (d) 子树TA3 (e)子树TA4
/*初始左边界*/ /*初始右边界*/
while ( left <= right )
{
mid = (left+right)/2; /*计算中间元素坐标*/
if( K < Tbl->Element[mid])
Baidu Nhomakorabea
right = mid-1; /*调整右边界*/
else if( K > Tbl->Element[mid]) left = mid+1;
/*调整左边界*/
else return mid; /*查找成功,返回数据元素的下标*/
} return NotFound;
/*查找不成功,返回-1*/
}
二分查找算法具有对数的时间复杂度O(logN)
[例] 仍然以上面13个数据元素构成的有序线性表为例 二分查找关健字为 43 的数据元素如下:
5 16 39 45 51 98 100 202 226 321 368 444 501 1 2 3 4 5 6 7 8 9 10 11 12 13
1、left = 1, right = 13; mid = (1+13)/2 = 7:
100 > 43;
2、 left = 1, right = mid-1= 6; mid = (1+6)/2 = 3: 39 < 43;
A
B
C
D
F GH IJ K
L
M
12.有序树和无序树:对于一棵树,若其中每一个结点的子树 (若有)具有一定的次序,则该树称为有序树,否则称为无序树。
13.森林(forest):是m(m≧0)棵互不相交的树的集合。 显然,若将一棵树的根结点删除,剩余的子树就构成了森林。
树的表示
A
BC D
E F G HIJ
的根结点的父结点 5. 子结点(Child):若A结点是B结点的父结
点,则称B结点是A结点的子结点;子结点也 称孩子结点。 6. 兄弟结点(Sibling):具有同一父结点的各 结点彼此是兄弟结点。
A
B
C
D
F GH IJ K
L
M
树的一些基本术语
7. 路径和路径长度:从结点n1到nk的路径为一 个结点序列n1 , n2 ,… , nk , ni是 ni+1的父结 点。路径所包含边的个数为路径的长度。
顺序查找算法的时间复杂度为O(n)。
0K
1 2 3 4 5 6 7 8 9 10
方法2:二分查找(Binary Search) 假设n个数据元素的关键字满足有序(比如:小到大)
并且是连续存放(数组),那么可以进行二分查找。
[例] 假设有13个数据元素,按关键字由小到大顺序存放. 二分查找关健字为444的数据元素过程如下:
5/25
二叉树的存储结构
1. 顺序存储结构
用一组地址连续的存储单元依次“自上而下、自左至右”存储完全二叉树
的数据元素。对于完全二叉树上编号为i的结点元素存储在一维数组的下标
值为i的分 量中。
n个结点的完全二叉树的结点父子关系:
非根结点(序号i ≥1)的父结点的序
号是 i / 2;当 i / 2=0时,该结点是
8. 祖先结点(Ancestor):沿树根到某一结点路 径上的所有结点都是这个结点的祖先结点。
9. 子孙结点(Descendant):某一结点的子树 中的所有结点是这个结点的子孙。
10. 结点的层次(Level):规定根结点在1层, 其它任一结点的层数是其父结点的层数加1。 11. 树的深度(Depth):树中所有结点中的最 大层次是这棵树的深度。
4.1树与树的表示
树型结构是一类非常重要的非线性结构。直观地,树型结构是以分支关 系定义的层次结构。
树在计算机领域中也有着广泛的应用,例如在编译程序中,用树来表示 源程序的语法结构;在数据库系统中,可用树来组织信息;在分析算法的行为 时,可用树来描述其执行过程等等。
本章将详细讨论树和二叉树数据结构,主要介绍树和二叉树的概念、术 语,二叉树的遍历算法。树和二叉树的各种存储结构以及建立在各种存储结构 上的操作及应用等。
性质2: 深度为k的二叉树上至多含2k-1个结点。(k≥1)
性质3:
对任何一棵二叉树,若它含有n0个叶子结点、n2个度为2的结点, A 则必存在关系式:n0 = n2+1。
B
C
D
E
F
JK
H
n0 = 4,n1 = 2 n2 = 3; n0 = n2 +1
满二叉树的特点: ◆ 基本特点是每一层上的结点数总是最大结点数。 ◆ 满二叉树的所有的支结点都有左、右子树。 ◆ 可对满二叉树的结点进行连续编号,若规定从根结点开始,按“自上而 下、自左至右”的原则进行。
由此可知,二叉树的定义是递归的。
二叉树具体五种基本形态
空树 只含根结点 右子树为空树
Ф TL
(a) (b)
(c)
TR
TL
TR
(d)
(e)
二叉树的子树有左右顺序之分
左子树为空树
左右子树均不 为空树
特殊二叉树
斜二叉树(Skewed Binary Tree)
A
B
C
D
完美二叉树(Perfect Binary Tree) 满二叉树(Full Binary Tree)
3、left = mid+1=4, right = 6; mid = (4+6)/2 = 5: 51 > 43; 4、left = 4, right = mid-1= 4; mid = (4+4)/2 = 4: 45 > 43; 5、left = 4, right = mid-1= 3; left > right ? 查找失败,结束;
完全二叉树是满二叉树的一部分,而满二叉树是完全二叉树的特例。
完全二叉树的特点: 若完全二叉树的深度为k ,则所有的叶子结点都出现在第k层或k-1层。
对于任一结点,如果其右子树的最大层次为l,则其左子树的最大层次为l 或l+1。
性质4:n个结点的完全二叉树深度为:㏒2n +1。 其中符号: x表示不大于x的最大整数。 x 表示不小于x的最小整数。
1
A
2
3
B
4
5
D
E
C
6
7
F
G
8
9 10
H
JK
1
2
3
1
2
3
4
5
6
7
4
5
67
8 9 10 11 12 13 14 15 8 9 10 11 12
(a) 满二叉树
(b) 完全二叉树
1
1
2
3
45
6
2
3
4
5
67
(c) 非完全二叉树 图6-4 特殊形态的二叉树
二叉树几个重要性质 性质1:
在二叉树的第i层上至多有2i-1个结点。(i≥1)
动态查找:集合中记录是动态变化的 除查找,还可能发生插入和删除
静态查找
方法1:顺序查找(数组存储)
Tbl 10
int SequentialSearch (StaticTable *Tbl, ElementType K) { /*在表Tbl[1]~Tbl[n]中查找关键字为K的数据元素*/
int i; Tbl->Element[0] = K; /*建立哨兵*/ for(i = Tbl->Length; Tbl->Element[i]!= K; i--); } return i; /*查找成功返回所在单元下标;不成功返回0*/
相关文档
最新文档