树的基本概念以及与树相关的算法

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

根作为由子树森林组成的表的名字写在表的左边
data link 1 link 2 ... 麻烦问题:应当开设多少个链域? link n
7
左孩子-右兄弟表示法
( A ( B ( E ( K, L ), F ), C ( G ), D ( H ( M ), I, J ) ) ) 数据 右兄弟 左孩子
A B
问:具有3个结点的二叉树可能有几种不同形态?普通树呢?
5种/2种
16
二叉树的抽象数据类型定义
ADT BinaryTree{ 数据对象D: D是具有相同特性的数据元素的集合。 数据关系R: 若D=Φ,则R= Φ ; 若D≠Φ,则R= {H};存在二元关系: ① root 唯一 //关于根的说明 ② Dl∩Dr= Φ //关于子树不相交的说明 ③ …… //关于数据元素的说明 ④ …… //关于左子树和右子树的说明 //至少有20个 基本操作 P: }ADT BinaryTree
折半查找
数组a中存放从小到大排好序的n个整数,查找给定值k在数组 中的下标;若查找失败,返回-1。
找37
0 5 low 1 13 2 3 4 19 21 37 5 56 6 7 64 75 mid 查找成功 8 9 10 11 12 13 14 80 88 92 100 111 120 125 high
性质4: 具有n个结点的完全二叉树的深度必为 log2n +
1
证明:根据性质 2,深度为k的二叉树最多只有 2k-1个结点,且完全二叉树 的定义是与同深度的满二叉树前面编号相同,即它的总结点数 n位于k 层和 k-1层满二叉树容量之间,即 2k-1-1<n≤2k-1 或2k-1≤n<2k 三边同时取对数,于是有:k-1≤log2n<k 因为k是整数, 所以k= log2n +1
注1:过去许多书籍中都定义树为n≥1,曾经有“空树不是 树”的说法,但现在树的定义已修改。 注2:树的定义具有递归性,即树中还有树。
5
图形表示法: 河南大学

历史学院
计算机学院
数学学院
教师
学生
其他人员 子树
2010级 2011级 2012级 2013级 叶子
6
广义表表示法
( A ( B ( E ( K, L ), F ), C ( G ), D ( H ( M ), I, J ) )
具有n个结点的折半查找判定树的深度为
查找成功
在表中查找任一记录的过程,即是折半查找判定树中从根结点到该
log 2 n +1
记录结点的路径,和给定值的比较次数等于该记录结点在树中的层 数。
Leabharlann Baidu
查找不成功
查找失败的过程就是走了一条从根结点到外部结点的路径,和给定
值进行的关键字的比较次数等于该路径上内部结点的个数。
讨论3:树的链式存储方案应该怎样制定?
可用多重链表:一个前趋指针,n个后继指针。 细节问题:树中结点的结构类型样式该如何设计? 即应该设计成“等长”还是“不等长”? 缺点:等长结构太浪费(每个结点的度不一定相同); 不等长结构太复杂(要定义好多种结构类型)。 解决思路:先研究最简单、最有规律的树,然后设法把 一般的树转化为简单树。
折半查找
判定树的构造方法
当n=0时,折半查找判定树为空;
当n>0时,折半查找判定树的根结点是有序表中序号为 mid=(n+1)/2的记录,根结点的左子树是与有序表r[1] ~ r[mid-1] 相对应的折半查找判定树,根结点的右子树是与r[mid+1] ~ r[n] 相对应的折半查找判定树。
11
3. 树的逻辑结构
(特点): 一对多(1:n),有多个直接后继(如家谱 树、目录树等等),但只有一个根结点,且 子树之间互不相交。
4. 树的存储结构 讨论1:树是非线性结构,该怎样存储? ————仍然有顺序存储、链式存储等方式。
12
讨论2:树的顺序存储方案应该怎样制定?
可规定为:从上至下、从左至右将树的结点依次存入内存。 重大缺陷:复原困难(不能唯一复原就没有实用价值)。
折半查找
折半查找的平均查找长度 推 导 过 程
1次比较就查找成功的元素有1个(20),即中间值; 2次比较就查找成功的元素有2个(21),即1/4处(或3/4)处; 3次比较就查找成功的元素有4个(22),即1/8处(或3/8)处… 4次比较就查找成功的元素有8个(23),即1/16处(或3/16)处… …… 则第h次比较时查找成功的元素会有(2h-1)个;
D H I J E
A C
F K
G
L M N O
深度为4的满二叉树
A B C E
D
H I
F
G
n1的个数是?
J
深度为4的完全二叉树
21
进阶篇
折半查找
查找过程:每次将待查记录所在区间缩小一半
适用条件:采用顺序存储结构的有序表
算法实现
设表长为n,low、high和mid分别指向待查元素所在区间的上界、下
18
讨论3:二叉树的叶子数和度为2的结点数之间有关系吗?
证明:
性质3: 对于任何一棵二叉树,若2度的结点数有n2个, 则叶子数(n0)必定为n2+1 (即n0=n2+1)
∵ 二叉树中全部结点数n=n0+n1+n2(叶子数+1度结点数+2度结点数) 又∵二叉树中全部结点数n=B+1 ( 总分支数+根结点 )
界和中点,k为给定值
初始时,令low=1,high=n,mid=(low+high)/2 让k与mid指向的记录比较
若k==r[mid].key,查找成功
若k<r[mid].key,则high=mid-1 若k>r[mid].key,则low=mid+1 重复上述操作,直至low>high时,查找失败
折半查找
折半查找算法 int Search(int a[],int n,int k) { int low,high,mid,found; low=0; high=n-1; found=0; while((low<=high)&&(found==0)) { mid=(low+high)/2; if(k>a[mid]) low=mid+1; else if (k==a[mid]) found=1; else high=mid-1; } if(found==1) return mid; else return -1; }
折半查找
找90
0 5 low 1 13 2 3 4 19 21 37 5 56 6 7 64 75 mid 查找失败 8 9 10 11 12 13 14 80 88 92 100 111 120 125 high
折半查找
判定树
折半查找的过程可以用二叉树来描述,树中的每个结点对应有序 表中的一个记录,结点的值为该记录在表中的位置。把当前查找 区间的中间位置作为根,左子表和右子表分别作为根的左子树和 右子树。由此得到的二叉树称为折半查找的判定树。
性质5: 对完全二叉树,若从上至下、从左至右编号,则
编号为i 的结点,其左孩子编号必为2i,其右孩子编号必为 2i+1;其双亲的编号必为i/2(i=1 时为根,除外)。
可根据归纳法证明。
20
满二叉树:一棵深度为k 且有2k -1个结点的二叉树。 (特点:每层都“充满”了结点) B 完全二叉树:深度为k 的,有n个结点 的二叉树,当且仅当其每一个结点都与 深度为k 的满二叉树中编号从1至n的结 点一一对应。 完全二叉树的特点就是,只有最后一层 叶子不满,且全部集中在左边。 这其实是顺序二叉树的含义。在图论概 念中的“完全二叉树”是指n1=0的情况。
10
2.
若干术语(续)
B E K L F
A
C D H M I J
结点 ——即树的数据元素 结点的度——结点挂接的子树数(有
几个直接后继就是几度,亦称“ 次数”)
G
结点的层次 ——从根到该结点的层数(根结点算第一层) 终端结点 ——即度为0的结点,即叶子 分支结点 ——即度不为0的结点(也称为内部结点) 树的度 ——所有结点度中的最大值(Max{各结点的度}) 树的深度——指所有结点中最大的层数(Max{各结点的层次}) (或高度) 问:右上图中的结点数= 13 ;树的度= 3 ;树的深度= 4
(除根结点外,每个结点必有一个直接前趋,即一个分支)
而 总分支数B= n1+2n2 (1度结点必有1个直接后继,2度结点必有2个) 三式联立可得: n0+n1+n2= n1+2n2 +1, 即n0=n2+1 实际意义:叶子数=2度结点数+1
D H I B E J F A C G
19
对于两种特殊形式的二叉树(满二叉树和完全二叉树), 还特别具备以下2个性质:
折半查找
加上外部结点的判定树
1 5 2 13 3 19 4 21 5 37 6 56 7 64 8 75 9 80 10 88 11 92
3
<
6 =
>
9
1 2
1
-1 1-2 2 2-3 3-4
4
5 4-5 5-6 6-7
7
8 9-10 8-9
10 内结点
11 h 11外结点
7-8
10-11
若所有结点的空指针域设置为一个指向一个方形结点的指针,称 方形结点为判定树的外部结点;对应的,圆形结点为内部结点。
9
A
2.
若干术语
B
C
D J
根 ——即根结点(没有前驱) E F G H I 叶子 ——即终端结点(没有后继) 森林 ——指m棵不相交的树的集 K L M 合(例如删除A后的子树个数) ——结点各子树从左至右有序,不能互换(左为第一) 有序树 ——结点各子树可互换位置。 无序树 双亲 ——即上层的那个结点(直接前驱) 孩子 ——即下层结点的子树的根(直接后继) 兄弟 ——同一双亲下的同层结点(孩子之间互称兄弟) 堂兄弟 ——即双亲位于同一层的结点(但并非同一双亲) 祖先 ——即从根到该结点所经分支的所有结点 子孙 ——即该结点下层子树中的任一结点
折半查找
练习
假定每个元素的查找概率相等,求查找成功时的平均查找长度。
3
<
6 =
>
9
1 2
1
-1 2 3-4
4
5 6-7
7
8 9-10
10 内结点
11 h
1-2
2-3
4-5
5-6
7-8
8-9
10-11
11外结点
ASL=1/11*(1*1+2×2+4×3+4*4 )=33/11=3
折半查找
折半查找性能分析
17
2. 二叉树的性质
(3+2)
讨论1:第i层的结点数至多是多少? 2i-1个
性质1: 在二叉树的第i层上至多有2i-1个结点(i>0)。
提问:第i层上至少有 1 个结点?
讨论2:深度为k的二叉树,至多有多少个结点? 2k-1
性质2: 深度为k的二叉树至多有2k-1个结点(k>0)。
提问:深度为k时至少有 k 个结点?
二叉树
13
5. 树的运算 要明确: 1. 普通树(即多叉树)若不转化为二叉树,则运 算很难实现。 2. 二叉树的运算仍然是插入、删除、修改、查找、 排序等,但这些操作必须建立在对树结点能够 “遍历”的基础上! (遍历——指每个结点都被访问且仅访问一次, 不遗漏不重复)。
本章重点:二叉树的表示和实现
14
2 二叉树
为何要重点研究每结点最多只有两个 “叉” 的树? 二叉树的结构最简单,规律性最强; 可以证明,所有树都能转为唯一对应的二叉树,不失一般性。
1.
二叉树的定义
2.
二叉树的性质
15
1. 二叉树的定义
定义:是n(n≥0)个结点的有限集合,由一个根结点以及两 棵互不相交的、分别称为左子树和右子树的二叉树组成 。 逻辑结构: 一对二(1:2) 基本特征: ① 每个结点最多只有两棵子树(不存在度大于2的结点); ② 左子树和右子树次序不能颠倒(有序树)。 基本形态:
树状存储架构
冯世豪
基础篇
内容提纲
1. 树的基本概念 2. 折半查找(二分查找) 3. 二叉排序树
树的基本概念
1. 2 树的定义 若干术语
3.
4.
逻辑结构
存储结构
5.
6.
树的运算
二叉树
1.
树的定义
由一个或多个(n≥0)结点组成的有限集合T,有且 仅有一个结点称为根(root),当n>1时,其余的结 点分为m(m≥0)个互不相交的有限集合T1,T2,…, Tm。每个集合本身又是棵树,被称作这个根的子树 。
C
D
E
F
G
H
I
J
K
L
M
8
树的抽象数据类型定义
ADT Tree{ 数据对象D: D是具有相同特性的数据元素的集合。 数据关系R: 若D为空集,则称为空树;//允许n=0 若D中仅含一个数据元素,则R为空集; 其他情况下的R存在二元关系: ① root 唯一 //关于根的说明 ② Dj∩Dk= Φ //关于子树不相交的说明 ③ …… //关于数据元素的说明 基本操作 P: //至少有15个 }ADT Tree
相关文档
最新文档