第6章树和二叉树1
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
树的定义
root n >1 T1 E K L B F A T2 C G H M D I T3 J 子树之间存在的关系?
树是有向树。 树是一种层次分明的结构。
有序树 无序树
13个数据元素之间存在下列关系: R={<A,B>,<A,C>,<A,D>, <B,E>,<B,F>,<C,G>,<D,H>,<D,I>,<D,J>,
针对结构中数据元素之间存在的关系, 将树和线性结构作如下对照:
线性结构 存在唯一的没有 前驱的"首元素" 存在唯一的没有 后继的"尾元素" 其余元素均存在 唯一的"前驱元素"和 唯一的"后继元素" 树结构 存在唯一的没有前 驱的"根结点" 存在多个没有后继 的"叶子" 其余结点均存在唯 一的"前驱(双亲)结点" 和多个"后继(孩子)结点 "
二叉树中的分支数目
①
假设 b 为分支数,则 n=b+1。
从另一角度看,这些分支是由度为1或2的结点射 出的,所以又有 b = n1+ 2n2 即n = n1+ 2n2 + 1 ② 综合以上①和②两个等式便可得到 n0 = n 2 + 1
6.2.2 二叉树的性质
有两种特殊形态的二叉树:
2
1
3
5 6 7
性质1 若二叉树的层次从1开始, 则在二叉树的第 i 层最多有 2i-1 个结点。(i 1) [用数学归纳法证明]
i =1 2i-1=20=1 假设:i =k 2k-1
i =k+1 2k-1 x 2 = 2(k+1)-1
性质2 深度为k的二叉树最多有 2k-1个结点。(k 1)
证明:
k k ( 第i层上的最大结点数 ) = 2i-1 = 2k-1 i=1 i=1
对满二叉树从上到下从左到右进行从1开始 的编号,则任意一棵二叉树都可以和同深度的 满二叉树相对比。 假如一棵包含 n 个结点的二叉树中每个结点 都可以和满二叉树中编号为1至 n 的结点一、一 对应,则称这类二叉树为完全二叉树。
6.2.2 二叉树的性质
性质4 具有n个结点的完全二叉树的深度为 log2n +1
6.2 二叉树 (Binary Tree)
6.2.1二叉树的定义
一棵二叉树是结点的一个有限集合,该集合或者为空,或者 是由一个根结点加上两棵分别称为左子树和右子树的、互不相交 的二叉树组成。 特点:1)每个结点的度≤2 2)是有序树
二叉树的五种不同形态
二叉树的抽象数据类型(p121)
6.2.2 二叉树的性质
<E,K>,<E,L>,<H,M>}
基本术语
结点
分支
结点层次
结点的度 树的度
叶子结点
分支结点 树的深度
结点(node) 数据元素+若干指向子树根的分支 结点的度(Degree) 分支的个数 叶(Leaf)结点 度为0的结点 树的度 树中所有结点的度的最大值 分支(Branch)结点 度大于0的结点 孩子(Child)结点、双亲(Parent)结点、兄弟(Sibling)结点、祖先结点、子孙结点 结点所处层次(Level) 从根开始定义,根为第一层 树的深度(depth) 树中叶子结点所在的最大层次数。
基本操作
{结构初始化} InitTree(&T); 操作结果:构造空树 T。 CreateTree(&T,definition); 初始条件:definition 给出树T的定义。 操作结果:按 definition 构造树 T。
{销毁结构} DestroyTree(&T); 初始条件:树 T 存在。 操作结果:销毁树 T。 {引用型操作} TreeEmpty(T); 初始条件:树 T 存在。
{加工型操作} Assign(T, cur_e, value); 初始条件:树T存在,cur_e 是 T 中某个结点。 操作结果:结点 cur_e 赋值为 value。 ClearTree(&T); 初始条件:树 T 存在。 操作结果:将树 T 清为空树。
基本操作
InsertChild(&T, &p, i, c); 初始条件:树 T 存在,p 指向T中某个结点,1≤i≤p 所指结点的度+1, 非空树 c 与 T 不相交。 操作结果:插入 c 为 T 中 p 所指结点的第 i 棵子树。 DeleteChild(&T, &p, i); 初始条件:树 T 存在,p 指向 T 中某个结点,1≤i≤p 指结点的度。 操作结果:删除 T 中 p 所指结点的第 i 棵子树。 } ADT Tree
证明:设完全二叉树的深度为k,则有 2k-1 - 1 < n 2k - 1 或 2k-1 n < 2k 取对数得: k-1 log2n < k 因为k为整数,所以k = log2n +1
6.2.2 二叉树的性质
性质5 如果将一棵有n个结点的完全二叉树的结点按层序(自 顶向下,同一层自左向右)连续编号1, 2, …, n,然后按此结 点编号将树中各结点顺序地存放于一个一维数组中, 并简称编 号为i的结点为结点i (1 i n)。则有以下关系:
基本术语
森林:为m(m>=0)棵互不相交的树的集合。
另一个角度定义树: 树: 是一个二元组Tree=(root,F) 其中:root是数据元素,称作树的根。 F是子树森林,记作F=(T1,T2,…,Tm)
其中:Ti=(ri,Fi)称作根root的第i棵(符合本定义
的)子树,当m!=0,在树根和其子树森林 之间存在下列关系: RF={<root,ri>|i=1,2,…,m,m>0}
第6章 树和二叉树
6.1树的定义和基本术语 6.2二叉树 6.2.1二叉树的定义 6.2.2二叉树的性质 6.2.3二叉树的存储结构 6.3遍历二叉树和线索二叉树 6.4树与森林 6.5赫夫曼树及其应用
6.1 树的定义和基本术语
树:是n(n0)个结点的集合。
ADT Tree { 数据对象:D是具有相同特性的数据元素的集合。
(1) 如果 i=1,则编号为 i 的结点是二叉树的根,无双亲;如果 i>1,则其双 亲结点 parent(i) 的编号是 i/2。 (2) 如果 2i>n,则编号为 i 的结点无左孩子(编号为 i 的结点为叶子结点); 否则其左孩子结点 lChild(i) 的编号是 2i 。 (3) 如果 2i+1>n,则编号为 i 的结点无右孩子;否则其右孩子结点 rChild(i) 的编号是结点 2i+1。
基本操作
RightSibling(T, cur_e); 初始条件:树 T 存在,cur_e 是 T 中某个结点。 操作结果:若 cur_e 有右兄弟,则返回它的右兄弟,否则返回"空“。 TraverseTree(T, visit()); 初始条件:树T存在,visit 是对结点操作的应用函数。 操作结果:按某种次序对 T 的每个结点调用函数 visit() 一次且至多一次。 一旦 visit() 失败,则操作失败。
• •
满二叉树(Full Binary Tree) 完全二叉树(Complete Binary Tree)
1 2 4 5 6 3 7
4
若二叉树中所有的分支结点的度数都为2, 且叶子结点都在同一层次上,则称这类二叉树为 满二叉树。
14 15
8
9
10
11
wenku.baidu.com
12
13
1 2 4 8 9 10 5 11 12 6 3 7
数据关系: 若 D 为空集,则称为空树; 若 D 中仅含一个数据元素,则关系R为空集; 否则 R={H}, (1) 在D中存在唯一的称为根的数据元素 root,它在关系H下无前驱; (2) 当n>1时,其余数据元素可分为 m(m>0) 个互不相交的(非空)有限集 T1,T2,…,Tm, 其中每一个子集本身又是一棵符合本定义的树,称为根 root 的子 树,每一棵子树的根 xi 都是根 root 的后继,即 <root,xi> H,i=1,2,…,m。
6.2.2 二叉树的性质
1 2
第j层 第j+1层 2j 2j-1
2j+1
i 2i 2i+1 i+1 2i+2 2i+3
3
n-3
n-2
n-1
n
作业: 分别证明二叉树的5个性质。
20+21+22+23+…+2k-1=2k-1
6.2.2 二叉树的性质
性质3 对任何一棵二叉树, 如果其叶结点个数为 n0, 度为2的非叶结 点个数为 n2, 则有 n0=n2+1。
二叉树中只有三种结点 n2 假设n1为二叉树 T 中度为1的结点数,则二叉 树中结点总数为:
n1
n0
n= n0+ n1+n2
操作结果:若 T 为空树,则返回 TRUE,否则返回 FALSE。
基本操作
TreeDepth(T); 初始条件:树T存在。 操作结果:返回T的深度。 Root(T); 初始条件:树 T 存在。 操作结果:返回 T 的根。 Value(T, cur_e); 初始条件:树 T 存在,cur_e 是 T 中某个结点。 操作结果:返回 cur_e 的值。 Parent(T, cur_e); 初始条件:树 T 存在,cur_e 是 T 中某个结点。 操作结果:若 cur_e 是T的非根结点,则返回它的双亲,否则返回"空"。 LeftChild(T, cur_e); 初始条件:树 T 存在,cur_e 是 T 中某个结点。 操作结果:若 cur_e 是T的非叶子结点,则返回它的最左孩子,否则返回 "空"。