第7章-树和二叉树
第7章-树和二叉树第2讲-二叉树的概念
第一层
树的特 点?
第二层 第三层 第四层
复习:二、树的基本术语
1.结点A、D的度?树的度? 2;3;3; 2.根结点?分支结点?叶子结点? A;BCDE;GHIJF;
在二叉链中,空指针的个数?
b A
B∧
C
∧D
∧E∧
∧F∧
∧G∧
n个结点 2n个指针域 分支数为n-1 非空指针域有n-1个 空指针域个数 = 2n-(n-1) = n+1
n=7 空指针域个数=8
39/10
40/10
二叉树
当n=3,结果为ห้องสมุดไป่ตู้。
第n个Catalan数
41/23
有n个结点并且高度为n的不同形态的二叉树个数是多少? 该二叉树:有n层,每层一个结点,该结点可以
43/23
结点个数为n,树形可以唯一确定 叶子结点个数为n0,树形不能唯一确定 n为奇数时,n1=0; n为偶数时,n1=1。 n0=n2+1 高度h= log2(n+1),是n个结点高度最小的二叉树
44/23
含有60个叶子结点的二叉树的最小高度是多少?
在该二叉树中,n0=60,n2=n0-1=59,n=n0+n1+n2=119+n1。 当n1=0且为完全二叉树时高度最小。 此时高度h=log2(n+1)= log2120=7。
作为双亲结点的左孩子,也可以作为右孩子 这样的二叉树的个数=1×2×…×2=2n-1。
例如,当n=3时有22=4个这样的二叉树。
第7章 图-有向无环图
算法的执行步骤: 算法的执行步骤: 1、用一个数组记录每个结点的入度。将入度为零的 、用一个数组记录每个结点的入度。 结点进栈。 结点进栈。 2、将栈中入度为零的结点V输出。 、将栈中入度为零的结点 输出 输出。 3、根据邻接表找到结点 的所有的邻接结点, 并将 、根据邻接表找到结点V的所有的邻接结点 的所有的邻接结点, 这些邻接结点的入度减一。 这些邻接结点的入度减一 。 如果某一结点的入度变 为零,则进栈。 为零,则进栈。
3
2
3、找到全为零的第 k 列,输出 k 、 4、将第 k 行的全部元素置为零 、 行的全部元素置为零
…………………
7
53、4;直至所有元素输出完毕。 、 ;直至所有元素输出完毕。
1 2 3 4 5 6 7
0 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
template<class T> int BinaryTree <T>:: NumOfOne ( node <T> *t )
{ int k=0; if (t==NULL ) //空二叉树 //空二叉树 return 0; if (t所指结点 的度为 k=1 所指结点 的度为1) k=1; d1= NumOfOne ( t->lchild); //递归求左子树叶结点数 //递归求左子树叶结点数 d2= NumOfOne ( t->rchild); } //递归求右子树叶结点数 //递归求右子树叶结点数 return (d1+d2+k);
A B
AOE网络:结点为事件,有向边指向表示事件的执行次序。 网络:结点为事件,有向边指向表示事件的执行次序。 网络 有向边定义为活动,边的权值为活动进行所需要的时间。 有向边定义为活动,边的权值为活动进行所需要的时间。
03、1数据结构第一部分--线性表-树与二叉树
数据结构(一)目录第1章序论 (1)1.1 什么是数据? (1)1.2 什么是数据元素? (1)1.3 什么是数据结构及种类? (1)1.4 数据的逻辑结构 (1)1.5 数据的物理结构 (1)1.6 算法和算法分析 (1)1.7 算法的五个特性 (1)1.8 算法设计的要求 (2)1.9 算法效率的度量 (2)第2章线性表 (3)2.1 线性表举例 (3)2.2 线性表的存储 (4)2.3 线性表-栈 (4)2.4 队列 (4)2.5 双端队列 (6)第3章树和二叉树 (6)3.1 树 (6)3.1.1 树的基本概念 (6)3.1.2 树的常用存储结构 (6)3.1.3 树的遍历 (7)3.2 二叉树 (7)3.2.1 二叉树的基本概念 (7)3.2.2 二叉树与树的区别 (7)3.2.3 树及森林转到二叉树 (7)3.2.4 二叉树的性质 (8)3.2.5 满二叉树 (8)3.2.6 完全二叉树 (8)3.2.7 完全二叉树的性质 (9)3.2.8 二叉树的四种遍历 (9)3.2.9 二叉排序树 (10)3.2.10 平衡二叉树 (11)3.2.11 m阶B-树 (11)3.2.12 最优二叉树 (11)3.2.13 二叉树的存储结构 (12)3.3 广义表 (13)3.4 矩阵的压缩存储 (14)3.4.1 特殊矩阵 (14)3.4.2 压缩存储 (14)第4章历年真题讲解 (15)4.1 2009年上半年 (15)4.2 2009年下半年 (15)4.3 2010年上半年 (15)4.4 2011年上半年 (16)4.5 2011年下半年 (16)4.6 2012年上半年 (17)4.7 2012年下半年 (17)4.8 2013年上半年 (18)4.9 2013年下半年 (18)4.10 2014年上半年 (18)4.11 2014年下半年 (19)4.12 2015年上半年 (19)4.13 2015年下半年 (19)4.14 2016年上半年 (20)第1章序论什么是数据?所有能输入到计算机中并能够被计算机程序处理的符号的总称,它是计算机程序加工的原料。
第7章树和二叉树第6讲-小结(1)
1
树
度为m的树中所有结点的度 ≤ m
5/23
先根遍历 后根遍历 层次遍历
具有递归性
6/23
给定一棵树T,将其转换成二叉树B后,T的先根遍历 对应B的什么遍历序列?
A A B
T
B
T2 T12
B
t11 t2
…
T11
…
t12
先根遍历:A B T11 T12 T2 …
先序遍历:A B t11 t12 t2 …
7/23
给定一棵树T,将其转换成二叉树B后,T的后 根遍历对应B的什么遍历序列?
10/23
在一棵树T中最常用的操作是查找某个结点 的祖先结点,采用哪种存储结构最合适? 双亲存储结构
如最常用的操作是查找某个结点的所有兄弟, 采用哪种存储结构最合适?
孩子链存储结构或者孩子兄弟链存储结构
11/23
2
二叉树
第n个Catalan数
当n=3,结果为5。
12/23
有n个结点并且高度为n的不同形态的二叉树个数是多 少?
A A B
B
T2 T12
…
t11
t2
T11
…
t12
后根序列: B T11 T12 T2 … A
中序序列:B t11 t12 t2 … A
8/23
已知一棵树T的先根序列和后根序列,可以唯一确定这 棵树?
树的定义和基本概念
25
6.2 二叉树
满二叉树的特点: (1)每一层结点数都达到最大值。即对给 定深度,它是具有最多结点数的二叉树 (2)满二叉树中不存在度数为1的结点,且树 叶都在最下一层上
【例】一个深度为3的满二叉树。
26
6.2 二叉树
完全二叉树特点: (1) 满二叉树是完全二叉树,完全二叉树不一 定是满二叉树。 (2) 叶子结点只可能在层次最大的两层上出现; (3) 对任一结点,若其右分支下的子孙的最大 层次为l,则其左分支下的子孙的最大层次 为必 l 或 l+1。
6.1 树的定义和基本术语
从逻辑结构看:
1)树中只有根结点没有前趋; 2)除根外,其余结点都有且仅一个前趋; 3)树的结点,可以有零个或多个后继; 4)除根外的其他结点,都存在唯一条从根 到该结点的路径; 5)树是一种分枝结构(除了一个称为根的 结点外)每个元素都有且仅有一个直接 前趋,有且仅有零个或多个直接后继。
6
6.1 树的定义和基本术语
A B E K L F , E, F, G, H, I, J,K,L,M} A是根,其余结点可以 划分为3个互不相交 的集合:T1, T2, T3
T1={B, E, F,K,L} , T2={C, G} , T3={D, H, I, J ,M}; 它们是A的子树。 对于 T1,B是根,其余结点可以划分为2个互不相 交的集合:T11={E,K,L},T12={F},T11,T12 7 是B 的子树。
3
第六章
树和二叉树
难点: • 二叉树的遍历及其有关应用
4
第六章
树和二叉树
• 树形结构是一类非常重要的非线性数据结构, 它是以分支关系定义的层次结构。它在现实世 界中广泛存在,在计算机领域中也有广泛应用 • 本章重点讨论二叉树的存储结构及其各种操作, 并研究树和森林与二叉树之间的转换关系。最 后给出一些应用实例
第7章树和二叉树(2)-数据结构教程(Java语言描述)-李春葆-清华大学出版社
二叉树也称为二分树,它是有限的结点集合,这个集合或者是空,或者由 一个根结点和两棵互不相交的称为左子树和右子树的二叉树组成。 二叉树中许多概念与树中的概念相同。 在含n个结点的二叉树中,所有结点的度小于等于2,通常用n0表示叶子结 点个数,n1表示单分支结点个数,n2表示双分支结与度为2的树是不同的。
度为2的树至少有3个结点,而二叉树的结点数可以为0。 度为2的树不区分子树的次序,而二叉树中的每个结点最多有 两个孩子结点,且必须要区分左右子树,即使在结点只有一棵 子树的情况下也要明确指出该子树是左子树还是右子树。
2/35
归纳起来,二叉树的5种形态:
Ø
4/35
3. 满二叉树和完全二叉树
在一棵二叉树中,如果所有分支结点都有左孩子结点和右孩子结点,并且 叶子结点都集中在二叉树的最下一层,这样的二叉树称为满二叉树。
可以对满二叉树的结点进行层序编号,约定编号从树根为1开始,按照层 数从小到大、同一层从左到右的次序进行。
满二叉树也可以从结点个数和树高度之间的关系来定义,即一棵高度为h 且有2h-1个结点的二叉树称为满二叉树。
R={r} r={<ai,aj> | ai,aj∈D, 1≤i,j≤n,当n=0时,称为空二叉树;否则其中
有一个根结点,其他结点构成根结点的互不相交的左、右子树,该 左、右两棵子树也是二叉树 } 基本运算: void CreateBTree(string str):根据二叉树的括号表示串建立其存储结构。 String toString():返回由二叉树树转换的括号表示串。 BTNode FindNode(x):在二叉树中查找值为x的结点。 int Height():求二叉树的高度。 … }
5
E
数据结构第七章 树和森林
7.5 树的应用
➢判定树
在实际应用中,树可用于判定问题的描述和解决。
•设有八枚硬币,分别表示为a,b,c,d,e,f,g,h,其中有一枚且 仅有一枚硬币是伪造的,假硬币的重量与真硬币的重量不同,可能轻, 也可能重。现要求以天平为工具,用最少的比较次数挑选出假硬币, 并同时确定这枚硬币的重量比其它真硬币是轻还是重。
的第i棵子树。 ⑺Delete(t,x,i)在树t中删除结点x的第i棵子树。 ⑻Tranverse(t)是树的遍历操作,即按某种方式访问树t中的每个
结点,且使每个结点只被访问一次。
7.2.2 树的存储结构
顺序存储结构 链式存储结构 不管哪一种存储方式,都要求不但能存储结点本身的数据 信息,还要能够唯一的反映树中各结点之间的逻辑关系。 1.双亲表示法 2.孩子表示法 3.双亲孩子表示法 4.孩子兄弟表示法
21
将二叉树还原为树示意图
A BCD
EF
A
B
C
E
D
F
A
B
C
E
D
F
22
练习:将下图所示二叉树转化为树
1 2
4
5
3
6
2 4
1 53
6
23
7.3.2 森林转换为二叉树
由森林的概念可知,森林是若干棵树的集合,只要将森林中各棵树 的根视为兄弟,森林同样可以用二叉树表示。 森林转换为二叉树的方法如下:
⑴将森林中的每棵树转换成相应的二叉树。 ⑵第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树 的根结点作为前一棵二叉树根结点的右孩子,当所有二叉树连起来 后,此时所得到的二叉树就是由森林转换得到的二叉树。
相交的集合T1,T2,…,Tm,其中每一个集合Ti(1≤i≤m)本身又是 一棵树。树T1,T2,…,Tm称为这个根结点的子树。 • 可以看出,在树的定义中用了递归概念,即用树来定义树。因此, 树结构的算法类同于二叉树结构的算法,也可以使用递归方法。
第七章二叉树和三叉树的期权定价方法
7.1.1 二叉树格的校对 二叉树格方法应该是风险中性过程一个良好的相似。
dS rSdt SdW
因此,我们应以这样的方式参数设置晶格,即保持着连续时间模型的 一些基本属性,这一过程就叫做校准。从 St 开始,经过一个小的时间 步 t ,从 2.5 节我们可以看到新价格是一个随机变量 St t ,且
0.4 ,存续期为 5 个月,利用 B-S 模型,我们知道结果是:
>> call blsprice(50,50,0.1,5 / 12,0.4)
6
>> call 6.1165 如果我们想用二叉树格方法逼近结果的话, 我们首先就要定义格 参数,假定每个时间步为一个月,然后
t 1 / 12 0.0833
最后我们得到这样的等式
e 2 rt 2t (u d )e tt 1
其中,利用 u 1 / d ,可以转化为二次方程:
u 2 e rt u(1 e 2rt ) ett 0
2t
方程的一个跟为
u (1 e 2 rt t ) (1 e 2 rt t ) 2 4e 2 rt
欧式看涨期权接收到通常我们所定义的参数和在此情况下的时 间步 N,通过增加最后一个参数,我们得到了更为精确的价格(同一 计算时间的增加) 。
call(50,50,0.1,5 / 12,0.4,5) >> call latticeEur
>> call
6.3595
call(50,50,0.1,5 / 12,0.4,500) >> call latticeEur
f 0 e rt [ pfu (1 p) f d ]
数据结构习题及答案与实验指导(树和森林)7
第7章树和森林树形结构是一类重要的非线性结构。
树形结构的特点是结点之间具有层次关系。
本章介绍树的定义、存储结构、树的遍历方法、树和森林与二叉树之间的转换以及树的应用等内容。
重点提示:●树的存储结构●树的遍历●树和森林与二叉树之间的转换7-1 重点难点指导7-1-1 相关术语1.树的定义:树是n(n>=0)个结点的有限集T,T为空时称为空树,否则它满足如下两个条件:①有且仅有一个特定的称为根的结点;②其余的结点可分为m(m>=0)个互不相交的子集T1,T2,…,T m,其中每个子集本身又是一棵树,并称为根的子树。
要点:树是一种递归的数据结构。
2.结点的度:一个结点拥有的子树数称为该结点的度。
3.树的度:一棵树的度指该树中结点的最大度数。
如图7-1所示的树为3度树。
4.分支结点:度大于0的结点为分支结点或非终端结点。
如结点a、b、c、d。
5.叶子结点:度为0的结点为叶子结点或终端结点。
如e、f、g、h、i。
6.结点的层数:树是一种层次结构,根结点为第一层,根结点的孩子结点为第二层,…依次类推,可得到每一结点的层次。
7.兄弟结点:具有同一父亲的结点为兄弟结点。
如b、c、d;e、f;h、i。
8.树的深度:树中结点的最大层数称为树的深度或高度。
9.有序树:若将树中每个结点的子树看成从左到右有次序的(即不能互换),则称该树为有序树,否则称为无序树。
10.森林:是m棵互不相交的树的集合。
7-1-2 树的存储结构1.双亲链表表示法以图7-1所示的树为例。
(1)存储思想:因为树中每个元素的双亲是惟一的,因此对每个元素,将其值和一个指向双亲的指针parent构成一个元素的结点,再将这些结点存储在向量中。
(2)存储示意图:-1 data:parent:(3)注意: Parrent域存储其双亲结点的存储下标,而不是存放结点值。
下面的存储是不正确的:-1 data:parent:2.孩子链表表示法(1)存储思想:将每个数据元素的孩子拉成一个链表,链表的头指针与该元素的值存储为一个结点,树中各结点顺序存储起来,一般根结点的存储号为0。
数据结构教程李春葆课后答案第7章树和二叉树
教材中练习题及参考答案
1. 有一棵树的括号表示为 A(B,C(E,F(G)),D),回答下面的问题: (1)指出树的根结点。 (2)指出棵树的所有叶子结点。 (3)结点 C 的度是多少? (4)这棵树的度为多少? (5)这棵树的高度是多少? (6)结点 C 的孩子结点是哪些? (7)结点 C 的双亲结点是谁? 答:该树对应的树形表示如图 7.2 所示。 (1)这棵树的根结点是 A。 (2)这棵树的叶子结点是 B、E、G、D。 (3)结点 C 的度是 2。 (4)这棵树的度为 3。 (5)这棵树的高度是 4。 (6)结点 C 的孩子结点是 E、F。 (7)结点 C 的双亲结点是 A。
12. 假设二叉树中每个结点值为单个字符,采用二叉链存储结构存储。设计一个算法 计算一棵给定二叉树 b 中的所有单分支结点个数。 解:计算一棵二叉树的所有单分支结点个数的递归模型 f(b)如下:
f(b)=0 若 b=NULL
6 f(b)=f(b->lchild)+f(b->rchild)+1 f(b)=f(b->lchild)+f(b->rchild)
表7.1 二叉树bt的一种存储结构 1 lchild data rchild 0 j 0 2 0 h 0 3 2 f 0 4 3 d 9 5 7 b 4 6 5 a 0 7 8 c 0 8 0 e 0 9 10 g 0 10 1 i 0
答:(1)二叉树bt的树形表示如图7.3所示。
a b c e h j f i d g e h j c f i b d g a
对应的算法如下:
void FindMinNode(BTNode *b,char &min) { if (b->data<min) min=b->data; FindMinNode(b->lchild,min); //在左子树中找最小结点值 FindMinNode(b->rchild,min); //在右子树中找最小结点值 } void MinNode(BTNode *b) //输出最小结点值 { if (b!=NULL) { char min=b->data; FindMinNode(b,min); printf("Min=%c\n",min); } }
计算机学科专业基础综合数据结构-树与二叉树(二)
计算机学科专业基础综合数据结构-树与二叉树(二)(总分:100.00,做题时间:90分钟)一、{{B}}单项选择题{{/B}}(总题数:44,分数:44.00)1.在下面关于树的相关概念的叙述中,正确的是______。
∙ A.只有一个结点的二叉树的度为1∙ B.二叉树的度一定为2∙ C.二叉树的左右子树可任意交换∙ D.深度为K的完全二叉树的结点个数小于或等于深度相同的满二叉树(分数:1.00)A.B.C.D. √解析:只有一个结点的二叉树的度为零。
二叉树的度可以为0、1、2;二叉树的左右子树不能任意交换。
2.已知一算术表达式的中缀形式为A+B+C-D/E,后缀形式为ABC*+DE/-,其前缀形式为______。
∙ A.-A+B*C/DE∙ B.-A+B*CD/E∙ C.-+*ABC/DE∙ D.-+A*BC/DE(分数:1.00)A.B.C.D. √解析:根据题目给出的中缀和后缀表达式可以得到其算术表达式为:(A+B*C)-D/E,前缀表达式:-+A*BC/DE。
3.算术表达式a+b*(c+d/e)转为后缀表达式后为______。
∙ A.ab+cde/*∙ B.abcde/+*+∙ C.abcde/*++∙ D.abcde*/++(分数:1.00)A.B. √C.D.解析:根据表达式a+b*(c+d/e)可知其后缀表达式为abcde/+*+。
4.某二叉树的先序遍历序列为IJKLMNO,中序遍历序列为JLKINMO,则后序遍历序列是______。
∙ A.JLKMNOI∙ B.LKNJOMI∙ C.LKJNOMI∙ D.LKNOJMI(分数:1.00)A.B.C. √D.解析:由先序和中序遍历序列确定一棵二叉树,再给出这棵二叉树的后序遍历序列。
[*] 由此图可以确认后序遍历的序列为LKJNOMI。
5.设森林F对应的二叉树为B,它有m个结点,B的根为P,P的右子树结点个数为n,森林F中第一棵树的结点个数是______。
树与二叉树典型例题讲解
A
F
B
J
E
F H
G
I J
例6.14
Huffman编码设计实例
已知某系统在通信联络中只可能出现8种字符,其概率分别为0.05, 0.29,0.07,0.08,0.14, 0.23,0.03,0.11,试设计Huffman编码。 解一:先构造Huffman树,再进行编码。 Huffman编码实现过程:以报文所用的不同字符为叶结点,以字符 出现频率为权重构造Huffman树;然后将树中结点指向其左孩子的 分支标“0”,指向其右孩子的分支标“1”;每个字符的编码即为 从根到每个叶子(字符)的路径上得到的0、1序列。这种对字符的 编码就是Huffman编码。
100
0 1
HC
42
0 1 0
58
1
0
1 2
0 1
1 0
1
0
3
1
1 1 0 0 0
1
1 1 0 1 1
1
1 0 1 1
0
1
23
0
19
1
29
1
29
1
11
0
8 5
14
0
15
1
4 5 6 7 8
1
3 Huffman树
7
8 Huffman编码
解二:利用Huffman编码算法实现。根据题意,取8个字符的权分别为 (5,29,7,8,14,23,3,11),n=8,则m=2*8-1=15,按上述 算法可构造一棵Huffman树,如下左图和右图分别Huffman树的初始 状态和终止状态。
a
b b d g e h i c ^ d c ^
f e ^ g
^ ^ ^
期权定价的二叉树模型
16/39
风险中性的投资者对风险不要求回报,他 们投资于任何资产所要求的收益率等于无风险 收益率。
投资回报率=无风险利率+风险溢价
第7章 期权定价的二叉树模型
2020/11/29
17/39
在一个假想的风险中性的世界(RiskNeutral World )里,所有的市场参与者都是风 险中性的,那么,所有的资产不管其风险的大 小或是否有风险,预期收益率都相同,都等于 无风险收益率,因此,所有资产现在的市场均 衡价格都应等于其未来价值的预期值,加上考 虑到货币的时间价值,就都是未来预期价值按 无风险收益率贴现的价值(即现值)。
2020/11/29
21/39
风险中性定理表达了资本市场中的这样的 一个结论:即在市场不存在任何套利可能性的 条件下,如果衍生证券的价格依然依赖于可交 易的基础证券,那么这个衍生证券的价格是与 投资者的风险态度无关的。
这个结论在数学上表现为衍生证券定价的 微分方程中并不包含有受投资者风险态度的变 量,尤其是期望收益率。
第7章 期权定价的二叉树模型
➢ 单步二叉树模型 ➢ 风险中性定价原理 ➢ 两步二叉树模型
一、单步二叉树模型
⒈ 一个示例
STu 22 cTu 1
S0 20 c0 ?
3个月
STd 18 cTd 0
执行价格为21 元的看涨期权。
第7章 期权定价的二叉树模型
2020/11/29
2/39
股票和股票期权所面临的系统风险相关,适 当配置两种资产可以消除系统风险,组建无风险 组合。
2020/11/29
34/39
⒉ 两步二叉树的一般形式
第7章 期权定价的二叉树模型
2020/11/29
7/39
数据结构(朱战立)章 (7)
7.1 树
7.1.1 树的定义 树是由n(n≥0)个结点构成的集合。 n=0的树称为空树;
对n>0的树T有: (1) 有一个特殊的结点称为根结点, 根结点没有前驱结点;
3
(2) 当n>1时, 除根结点外其他结点被分成m(m>0)个互不相 交的集合T1, T2,…, Tm, 其中每一个集合Ti(1≤i≤m)本身又 是一棵结构和树类同的子树。
10
7.1.2 树的表示方法 树的表示方法主要有三种, 分别用于不同的用途。 1. 直观表示法 图7 - 1就是一棵以直观表示法表示的树。 树的直观表示法
主要用于直观描述树的逻辑结构。 2. 形式化表示法 树的形式化表示法主要用于树的理论描述。 树的形式化表
示法定义树T为T=(D,R),其中D为树T中结点的集合, R为树T 中结点之间关系的集合。 当树T为空树时D=∅; 当树T不为空树 时有
5ቤተ መጻሕፍቲ ባይዱ
下面介绍树的其他一些常用术语。 结点: 由数据元素和构造数据元素之间关系的指针组成。 例如, 在图7 - 1(a)中有1个结点, 图7 - 1(b)中有12个结点。 结点的度: 结点所拥有的子树的个数称为该结点的度。 例 如, 在图7 - 1(b)中结点A的度为3, 结点B的度为2, 结点J的 度为0。 叶结点: 度为0的结点称为叶结点, 叶结点也称作终端结 点。 例如, 在图7 - 1(b)中结点J,F,K,L,H,I均为叶结点。
6
分支结点: 度不为0的结点称为分支结点, 分支结点也称 作非终端结点。 显然, 一棵树中除叶结点外的所有结点都是分 支结点。
孩子结点: 树中一个结点的子树的根结点称作这个结点的 孩子结点。 例如, 在图7 - 1(b) 中结点B,C,D是结点A的孩 子结点。 孩子结点也称作后继结点。
自考软件基础(数据结构--树与二叉树)
B
C
D
E
F
G
H
I
J
第 5 /209页
第二节 二叉树
一、定义
南昌大学
二叉树是一种重要的树形结构,它的特点是:二叉树可以为空(节点个
数为0),任何一个节点的度都小于或等于2,并且,子树有左、右之分,
其次序不能任意颠倒。 二叉树有5种基本形态,如图10-2所示。
第 6 /209页
第二节 二叉树
南昌大学
struct node
{ datatype data; struct node *Lchild,*rchild:
};
第 15 /209页
第二节 二叉树
南昌大学
例10-5 写出图10-8a所示二叉树的链式存储结构。其链式结构如图10-8b 所示。可以看出:具有n个节点的二叉树链式存储共有2n个链,其中只 有n-1个用来存放该节点的左、右孩子,其余的n +1个指针域为空。
解:第一步:由后序遍历结果确定整个二叉树根为A,由中序结果确定
A的左、右子树。 后序遍历结果: 中序遍历结果:
第 24 /209页
第三节 二叉树的遍历
第二步:确定A的左子树。 1)后序遍历结果:
南昌大学
中序遍历结果:
2)确定B的右子树: ①后序遍历结果:
第 25 /209页
第三节 二叉树的遍历
②中序遍历结果:
南昌大学
第 9 /209页
第二节 二叉树
下面介绍两种特殊的二叉树。
南昌大学
(1) 满二叉树指深度为k,且有2k-1个节点的二叉树。或者说除叶子节点外,
其它节点的度都为2的二叉树。
(2) 完全二叉树一个满二叉树的最下层从右向左连续缺少n (n>=0)个节点 的二叉树。 图10-3为满二叉树和完全二叉树示例。
第7章树和二叉树(4)-数据结构教程(Java语言描述)-李春葆-清华大学出版社
if (p.node.rchild!=null)
//有右孩子时将其进队
qu.offer(new QNode(p.lno+1,p.node.rchild));
}
}
return cnt;
}
7/31
解法2
层次遍历中某层的最右结点last
last
A
B
C
D
EF
G
last的作用确定一层是否遍历完成!
8/31
用cnt变量计第k层结点个数(初始为0)。设计队列仅保存结点引用, 置当前层次curl=1,用last变量指示当前层次的最右结点(根结点)进队。 将根结点进队,队不空循环:
int curl=1;
//当前层次,从1开始
BTNode<Character> last;
//当前层中最右结点
last=bt.b;
//第1层最右结点
qu.offer(bt.b);
//根结点进队
while (!qu.isEmpty())
{ if (curl>k) return cnt; p=qu.poll(); if (curl==k) cnt++; if (p.lchild!=null) { q=p.lchild; qu.offer(q); } if (p.rchild!=null) { q=p.rchild; qu.offer(q); } if (p==last) { last=q; curl++; }
}
Queue<QNode> qu=new LinkedList<QNode>(); //定义一个队列qu
QNode p;
qu.offer(new QNode(1,bt.b)); //根结点(层次为1)进队
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本章的基本内容是:
7.1 树的概念和性质 7.2 二叉树的概念和性质 7.3 二叉树的存储结构 7.4 二叉树的遍历 7.5 二叉树的其他操作算法 7.6 线索二叉树 7.7 树的存储结构与算法 7.8 Huffman树与Huffman编码 7.9 等价类问题
3、拷贝构造函数
算法7-5 二叉树的拷贝构造算法 BiTree<T>::BiTree(BiTree<T> &tree) { Root=Copy(tree.Root); }
BiNode<T> * BiTree<T>::Copy(BiNode<T> *p) { if(p==NULL) return NULL; BinTreeNode<T> *newp=new BinTreeNode<T>; newp->data=p->data; newp->lchild= Copy(p->lchild); // 复制左子树 newp->rchild= Copy(p->rchild); // 复制右子树 return newp; }
1
2018/1/7
7.1 树的概念和性质
7.1.1 树的定义 7.1.2 树的基本术语 7.1.3 树的基本性质
2
7.1.1 树的定义
树的结构
a
a
b
b c d
c
d
e
f
g
h
i
j
D={a, b, c, d} S={<a,b>, <a,c>, <a,d>}
D={a, b, c, d, e, f, g, h, i, j} S={<a,b>, <a,c>, <a,d>, < b,e>, <b,f>, <b,g>, <c,h>, <d,i>, <d,j>}
class BiTree { BiNode<T>* Root; // 根指针 public: BiTree() { Root=NULL; } // 无参构造函数,构造空树 };
7.4 二叉树的遍历
7.4.1 二叉树遍历的概念 7.4.2 二叉树遍历的算法 7.4.3 二叉树的构造和析构算法
BinTreeNode<T> *BinTree<T>::CreateByPre(vector<T> &pre, int &i) { T e=pre[i]; i++; // 提取当前数据 if(e=='*') return NULL; // 若是特殊数据,返回空指针 BinTreeNode<T> * p=new BinTreeNode<T>; // 创建新结点 p->data=e; p->lchild=CreateByPre(pre, i); // 创建左子树 p->rchild=CreateByPre(pre, i); // 创建右子树 return p; }
4、析构函数
算法7-6 二叉树的析构算法 BiTree<T>::~BiTree() { Free(Root); } void BiTree<T>::Free(BiNode<T> * p) { if(p==NULL) return; Free( p->lchild ); // 释放左子树 Free( p->rchild ); // 释放右子树 delete p; // 释放根结点 }
7.1.1 树的定义
非树的结构
a
a
b
c
d
b
c
d
e
f
ቤተ መጻሕፍቲ ባይዱ
g
h
i
j
e
f
g
h
i
j
7.1.2 树的基本术语
1、结点的度和树的度 2、孩子结点、双亲结点、兄弟结点 3、路径、路径长度 4、子孙结点、祖先结点 5、结点的层次、树的高度 6、有序树、无序树 7、森林
7.1.3 树的基本性质
BiNode<T>* BiTree<T>::CreateByPreMid(vector<T> &pre, vector<T> &mid, int ipre, int imid, int n) { if(n==0) return NULL; BinTreeNode<T> *p = new BinTreeNode<T>; // 创建新结点 p->data = pre[ipre]; for(int i=0; i<n; i++) // 在中序序列中定位根结点 f(pre[ipre]==mid[imid+i]) break; p->lchild = CreateByPreMid(pre, mid, ipre+1, imid, i); // 创建左子树 p->rchild = CreateByPreMid(pre, mid, ipre+i+1, imid+i+1, n-i-1); // 创建右子树 return p; }
7.4.1 二叉树遍历的概念
a b c ∧
∧
d
∧
∧
e
∧
∧
f
∧
先序序列:abdecf
中序序列:dbeafc 后序序列:debfca
7.4.1 二叉树遍历的概念
+ * /
∧
a
∧
∧
b
∧
∧
c
∧
∧
d
∧
先序序列(前缀表达式): +*ab/cd
中序序列(中缀表达式): a*b+c/d 后序序列(后缀表达式): ab*cd/+
7.3 二叉树的存储结构
7.3.1 二叉树的顺序存储结构 7.3.2 二叉树的链式存储结构 7.3.3 二叉树的类定义
7.3.1 二叉树的顺序存储结构
完全二叉树的顺序存储结构
a b c
0 1 2 3 4 5 6 a b c d e f
d
e
f
7.3.1 二叉树的顺序存储结构
7.4.2 二叉树遍历的算法
算法7-2 二叉树的层序遍历算法 void BiTree<T>::LevelOrder() { if(Root==NULL) return; // ①若二叉树为空,遍历结束 LinkQueue<BiNode<T> *> Q; // Q为指针队列 Q.EnQueue(Root); // ②将根指针加入指针队列 while(!Q.Empty()) // ③若指针队列不空,则循环 { BiNode<T> * p=Q.DeQueue(); // ④出队列,得到当前指针p cout<<p->data; // 访问当前结点 // ⑤若p有左、右孩子,则左、右孩子地址进队列Q if(p->lchild) Q.EnQueue(p->lchild); if(p->rchild) Q.EnQueue(p->rchild); } }
7.4.3 二叉树的构造和析构算法
1 、由单个遍历序列构造二叉树 2、由二个遍历序列构造二叉树 3、拷贝构造函数
1 、由单个遍历序列构造二叉树
算法7-3 由带空指针标记的先序序列构造二叉树的算法 BinTree<T>::BinTree(vector<T> &pre) { int i=0; // 向量pre的下标变量 Root=CreateByPre(pre, i); }
2、由二个遍历序列构造二叉树
先序遍历序列:ABHFDECKG 中序遍历序列:HBDFAEKCG
A
A
A B E 前:CKG 中:KCG
B
前:BHFD 中:HBDF 前:ECKG 中:EKCG
H
前:FD 中:DF
前:ECKG 中:EKCG
H
前:FD 中:DF
A B H D F E 前:CKG 中:KCG
非完全二叉树的顺序存储结构
a b c
0 1 2 3 4 5 6
e
d
a b c d
e
7.3.2 二叉树的链式存储结构
lchild
a
a ∧
data
rchild
b
b
c
d
∧ c ∧ d
e
f
∧ e ∧ f ∧
g
∧ g ∧
7.3.2 二叉树的链式存储结构
parent lchild data rchild
∧ a ∧
A B H D F K E C G
2、由二个遍历序列构造二叉树
算法7-4 由先序序列和中序序列构造二叉树的算法 BiTree<T>::BiTree(vector<T> &pre, vector<T> &mid) { n=pre.size(); Root=CreateByPreMid(pre,mid,0,0,n); }
7.2 二叉树的概念和性质
7.2.1 二叉树的定义 7.2.2 二叉树的基本性质
7.2.1 二叉树的定义