经典课件:数据结构第六章树和二叉树
数据结构-第6章 树和二叉树---4. 树和森林(V1)

6.4.1 树的存储结构
R AB C D EG F
R⋀
A
⋀D
⋀B
⋀E ⋀
C⋀
⋀G
⋀F ⋀
6.4.2 树、森林和二叉树的转换
1. 树转换为二叉树 将树转换成二叉树在“孩子兄弟表示法”中已 给出,其详细步骤是: ⑴ 加线。在树的所有相邻兄弟结点之间加一 条连线。 ⑵ 去连线。除最左的第一个子结点外,父结点 与所有其它子结点的连线都去掉。 ⑶ 旋转。将树以根结点为轴心,顺时针旋转 450,使之层次分明。
B C
D
A E
L HK
M
技巧:无左孩子 者即为叶子结点
6.4.3 树和森林的遍历
1. 树的遍历 由树结构的定义可知,树的遍历有二种方法。 ⑴ 先序遍历:先访问根结点,然后依次先序 遍历完每棵子树等。价于对应二叉树的先序遍历
⑵ 后序遍历:先依次后序遍历完每棵子树,然 后访问根结点。等价于对应二叉树的中序遍历
0 R -1 1A 0 2B 0 3C 0
}Ptree ; R
4D 1 5E 1
AB C
6F 3
7G 6
DE
F
8H 6
9I 6
G H I 10~MAX_Size-1 ... ...
6.4.1 树的存储结构
2. 孩子表示法
每个结点的孩子结点构成一个单链表,即有n 个结点就有n个孩子链表;
n个孩子的数据和n个孩子链表的头指针组成一 个顺序表; 结点结构定义: 顺序表定义:
typedef struct PTNode { ElemType data ;
第6章树和二叉树

9
6.1.4 树的存储结构
3.孩子兄弟表示法 孩子兄弟表示法 在结点中设置两个指针域, 在结点中设置两个指针域,一个指针域指向该结 点的第一个孩子,另一个指针域指向其右兄弟。 点的第一个孩子,另一个指针域指向其右兄弟。
2
6.1.1树的定义 树的定义
结点的度:结点所拥有子树的个数称为结点的度。 结点的度:结点所拥有子树的个数称为结点的度。 子树 称为结点的度 树的度:树中所有结点的度的最大值称为树的度。 最大值称为树的度 树的度:树中所有结点的度的最大值称为树的度。 叶结点:度为零的结点称为叶结点。也称终端结点 终端结点或 叶结点:度为零的结点称为叶结点。也称终端结点或叶 子 分支结点:度不为零的结点称为分支结点。也称非终端 分支结点:度不为零的结点称为分支结点。也称非终端 结点。除根结点以外,分支结点也称为内部结点。 结点。除根结点以外,分支结点也称为内部结点。 孩子结点和双亲结点: 孩子结点和双亲结点:树中一个结点的子树的根结点称 为孩子结点。该结点就称为孩子结点的双亲结点。 为孩子结点。该结点就称为孩子结点的双亲结点。 兄弟结点:具有同一双亲的孩子结点互为兄弟结点。 兄弟结点:具有同一双亲的孩子结点互为兄弟结点。 结点的祖先:从根到该结点所经分支上的所有结点, 结点的祖先:从根到该结点所经分支上的所有结点,称 为结点的祖先。 为结点的祖先。
17
6.2.2 二叉树的性质
性质4 具有n( 性质 具有 (n>0)个结点的完全二叉树的深度 )个结点的完全二叉树的深度h= log 2 n + 1 证明: 证明: 根据完全二叉树的定义可知深度为h-1层及以上的结点构成 根据完全二叉树的定义可知深度为 层及以上的结点构成 满二叉树,因此由性质2得深度为 得深度为h的完全二叉树满足 满二叉树,因此由性质 得深度为 的完全二叉树满足 n>2h-1-1和n≤2h-1 和 整理后得到 2h-1≤n<2h 不等式两边取对数, 不等式两边取对数,得 h-1≤log2n<h 由于h为正整数 为正整数, 由于 为正整数,因此 h= log 2 n + 1
树和叉树(数据结构)

第六章树和二叉树 6.1树(tree)的概念在日常生活中,可以见到很多情形可以归结为树结构。
如:家族谱系、行政管理机构、DOS和Windows 磁盘文件管理系统等。
我们讨论的树和自然界的树在生长方向上正好相反,它是倒长的树,即根朝上,枝干和叶子朝下。
例1:某家族谱系的一部分例2:国家行政管理机构的一部分例3:DOS和Windows磁盘文件的一部分C:\TC20VC6.0数据结构课件数据结构讲稿第一章第二章……MyTc程序Tc1Tc2……MyVc程序Vc1Vc2……树是一种层次结构,属于非线性结构。
我们学过的线性表可以灵活组织数据,但它受到线性结构的限制,表达层次结构不太方便。
6.1.1树的定义·树T是n(n≥0)个结点的有限集合。
它满足:(1)仅有一个特定的结点,称为根(root)结点;(2)其余结点分为m(m≥0)个互不相交的非空有限集合T,1,T2,……,T m,其中每个集合自身又是一棵树,称为根的子树(subtree)。
·为了表述方便,把没有结点的树称为空树。
·树的定义具有递归性:即一棵树是由根及若干棵子树构成的,而子树又是由根及若干棵子树构成的,……。
表达树的方法通常有4种:树形、凹入、集合和广义表(1) 树形表示法AB C DE F G H(2)凹入表示法ABCEFDGH(3)集合嵌套表示法A○E C○F○G D○H B(4)广义表表示法T(A(B,C(E,F),D(G,H)))6.1.3 树的基本术语为了对树的形态表述清楚和形象,通常引用树和人的特征及术语来描述。
(1)结点和树的度(degree)结点所拥有的子树的个数称为该结点的度,而树中各结点的度的最大值称为该树的度。
AB C DE F G H如:·结点B、E、F、G和H的度数是0·结点C和D的度数都是2·结点A的度数是3;显然3也是树的度数(2)叶子(leaf)结点和分支结点度为0的结点称为叶子结点(终端结点);度不为0的结点称为分支结点(非终端结点)。
第6章树和二叉树

第6章树和二叉树第 6 章树和二叉树6.1 已知一棵树如图所示,回答下列问题:(1) 哪个是根结点?(2) 哪些是叶子结点?(3) 哪个是结点 G 的双亲?(4) 哪些是结点 G 的祖先?(5) 哪些是结点 B 的孩子?(6) 哪些是结点B的子孙?(7) 哪些是结点 E 的兄弟?(8) 结点 B 和 H 的层次号分别是什么 ?(9) 树的深度是多少?(10) 以结点 C 为根的子树的深度是多少? 【6.1 解】:(1) A(2) K, F,G,H,I,J(3) B(4) B,A(5) E,F,G(6) E,F,G,K(7) F,G(8) 2, 3(9) 4(10) 26.2 在结点个数为n(n>1)的各棵树中,最小的高度是多少?它有多少个叶结点?多少个分支结点?最大的高度树是多少?它有多少个叶结点?多少个分去结点?【6.2解】结点个数为n时,高度最小的树高度为1,有2层;它有n-1个叶结点,1个分支结点;高度最大的树的高度为n-1,有n层;它有1个叶结点,n-1个分支结点。
6.3简述树与二叉树的区别?【6.3解】二叉树的度最大为2,而树的度可以大于2;二叉树的每个结点的孩子有左、右之分,而树中结点的孩子无左右之分。
6.4 n(n>1)个结点的各棵二叉树中,最小的高度(h≥1)多少?最大的高度是多少?【6.4解】最小高度为:⎣⎦n2log+1,此时树为完全二叉树;最大高度为n,比如一棵斜二叉树。
6.5如果一棵树有n1个度为1的结点,有n2个度为2的结点,…,n m个度为m的结点,试问有多少个度为0的结点?试推导之。
【6.5解】设叶子结点数为n0,则树中结点数和总度数分别为: 结点数=n0+n1+n2+...+n m总度数=n1+2n2+...+m×n m结点数等于总度数加1,所以得到:n0=∑=+-miini21))1((6.6如果已知一棵二叉树有20个叶子结点,有10个结点仅有左孩子,15个结点仅有右孩子,求出该二叉树的结点数目。
云大《数据结构》课程教学课件-第6章 树和二叉树(147P)_OK

^d ^ ^ e ^ 三叉链表
3)二叉链表是二叉树最常用的存储结构。还有其它链接方 法,采用何种方法,主要取决于所要实施的各种运算频度。
例:若经常要在二叉树中寻找某结点的双亲时,可在每个结 点上再加一个指向其双亲的指针域parent,称为三叉链表。
lchild data parent rchild
2021/8/16
2021/8/16
9
6.2 二 叉 树
6.2.1 二叉树的概念
一、二叉树的定义: 二叉树(Binary Tree)是n(n>=0)个结点的有限集,它或者是 空集(n=0)或者由一个根结点和两棵互不相交的,分别称 为根的左子树和右子树的二叉树组成。 可以看出,二叉树的定义和树的定义一样,均为递归定 义。
A
集合3
集合1
BCD
EF
G
集合2
2021/8/16
3
2、树的表示方法 1)树形图法
A
BCD
EF
G
2)嵌套集合法
3)广义表形式 ( A(B, C(E,F), D(G) )
4)凹入表示法
2021/8/16
A B
D
CG
EF
A B C E DF G
4
3、 树结构的基本术语
1)结点的度(Degree):为该结点的子树的个数。 2)树的度:为该树中结点的最大度数。
7)路径(Path):若树中存在一个结点序列k1,k2,…,kj,使得ki是 ki+1的双亲(1<=i<j),则称该结点序列是从ki到kj一条路径 (Path)
路径长度:路径的长度为j-1,其为该路径所经过的边的数 目。
A
BCD
EF
G
第六章-树和二叉树

之
树 和 二 叉 树 13
1 2 3 A B C
4 5 6 7 0 D E F
8 0
9 10 0 G
¾ 二叉树顺序存储的算法描述
数 据 结 构
¾ 初始化二叉树
之
树 和 二 叉 树 14
#define Max_Size 100 typedef int TElemType; typedef TElemType SqBT[Max_Size+1]; void InitBT(SqBT bt){//设置空树 int i; for(i=1;i<=Max_Size;i++) bt[i]=0; }
数 据 结 构
之
树 和 二 叉 树 19
¾ 后序遍历顺序二叉树算法 void PostBT(SqBT bt,int i){ if(i>Max_Size||!bt[i]) return; PostBT(bt,2*i); PostBT(bt,2*i+1); printf("%3d ",bt[i]); }
数 据 结 构
之
树 和 二 叉 树 4
5. 孩子结点、双亲结点、兄弟结点、堂兄弟 结点、祖先结点、子孙结点…… 6. 结点的层次从根开始,根为第一层,根的 孩子为第二层;若某结点在第L层,则其 子树的根就在第L+1层。 7. 树的深度或高度:树中结点的最大层次。 8. 有序树:如果将树中结点的各子树看成是 从左至右有次序的;反之,则是无序树。 9. 森林:是m棵互不相交的树的集合。
数 据 结 构
之
树 和 二 叉 树 25
¾ 打印一维数组 void printSq(SqBT bt){ int i; printf("\nSeqArray:"); for(i=1;i<=Max_Size;i++) printf("%3d ",bt[i]); }
数据结构(严蔚敏)课件第6章讲解学习

若D为空集,则称为空树 。
否则:
(1) 在D中存在唯一的称为根的数据元素root;
(2) 当n>1时,其余结点可分为m (m>0)个互
不相交的有限集T1, T2, …, Tm,其中每一 棵子集本身又是一棵符合本定义的树,
称为根root的子树。第7页
2020/7/25
基本操作: 查找类 插入类
线性结构
第一个数据元素 (无前驱)
树型结构
根结点 (无前驱)
最后一个数据元素 (无后继)
多个叶子结点 (无后继)
其它数据元素 (一个前驱、
一个后继)
2020/7/25
其它数据元素
(一个前驱、
多个后继)
第15页
基本术语
2020/7/25
第16页
结点: 数据元素+若干指向子树的分支
D
结点的度: 分支的个数
交的有限集合T0,T1,…,Tm-1,每个集合Ti(i=0,1,…,m-1)又是 一棵树,称为根的子树,每棵子树的根结点有且仅有一个直接前驱,
但可以有0个或多个直接后继。
由此可知,树的定义是一个递归的定义,即树的定义中又用到了树
的概念。
第6页
2020/7/25
ADT Tree{ 数据对象 D:
D是具有相同特性的数据元素的集合。
6.27,6.28,6.33,6.41,6.43,6.45,6.46,6.47, 6.49,6.50,6.51,6.57,6.59,6.68和6.66。
2020/7/25
第4页
6.1 树的类型定义
6.2 二叉树的类型定义
6.3 二叉树的存储结构
6.4 二叉树的遍历
6.5 线索二叉树6.6 树Fra bibliotek森林的表示方法
数据结构——用C语言描述(第3版)教学课件第6章 树与二叉树

6.2 二叉树 6.2.1 二叉树的定义与基本操作 6.2.2 二叉树的性质 6.2.3 二叉树的存储结构
6.2.1 二叉树的定义与基本操作 定义:我们把满足以下两个条件的树型结构叫做二 叉树(Binary Tree): (1)每个结点的度都不大于2; (2)每个结点的孩子结点次序不能任意颠倒。
有序树:在树T中,如果各子树Ti之间是有先后次序的,则称为有序树。 森林:m(m≥0)棵互不相交的树的集合。将一棵非空树的根结点删去,树就变成一 个森林;反之,给森林增加一个统一的根结点,森林就变成一棵树。
同构:对两棵树,通过对结点适当地重命名,就可以使两棵树完全相等(结点对应相 等,对应结点的相关关系也像等),则称这两棵树同构。
二叉树的基本结构由根结点、左子树和右子树组成
如图示
LChild Data RChild
Data
LChild RChild
用L、D、R分别表示遍历左子树、访问根结点、遍 历右子树,那么对二叉树的遍历顺序就可以有:
(1) 访问根,遍历左子树,遍历右子树(记做DLR)。 (2) 访问根,遍历右子树,遍历左子树(记做DRL)。 (3) 遍历左子树,访问根,遍历右子树(记做LDR)。 (4) 遍历左子树,遍历右子树,访问根 (记做LRD)。 (5) 遍历右子树,访问根,遍历左子树 (记做RDL)。 (6) 遍历右子树,遍历左子树,访问根 (记做RLD)。
(8) NextSibling(Tree,x): 树Tree存在,x是Tree中的某个结点。若x不 是其双亲的最后一个孩子结点,则返回x后面的下一个兄弟结点,否则 返回“空”。
基本操作:
(9) InsertChild(Tree,p,Child): 树Tree存在,p指向Tree 中某个结点,非空树Child与Tree不相交。将Child插入Tree中, 做p所指向结点的子树。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
有序树:
子树之间存在确定的次序关系。
无序树:
子树之间不存在确定的次序关系。
.
10
对比树型结构和线性结构 的结构特点
.
11
线性结构
第一个数据元素 (无前驱)
树型结构
根结点 (无前驱)
最后一个数据元素 (无后继)
多个叶子结点 (无后继)
其它数据元素
(一个前驱、 一个后继)
其它数据元素
(一个前驱、
多个后继)
的结点的子树根结点的层次
为l+1
树的深度:树中叶子结点所在的最大层次
.
8
森林:
root
F
A
是 m(m≥0)棵互 不相交的树的集合
B
C
D
E F GH I J
KL
M
任何一棵非空树是一个二元组
Tree = (root,F)
其中:root 被称为根结点,
F 被称为子树森林
.
9
有向树:
(1) 有确定的根; (2) 树根和子树根之间为有向关系。
3.双亲链表 4.线索链表
.
26
1. 二叉链表
root
结点结构: lchild data rchild
A
B C
D
E
F
.
27
C 语言的类型描述如下:
typedef struct BiTNode { // 结点结构 TElemType data; struct BiTNode *lchild, *rchild; // 左右孩子指针
.
17
性质 2 : 深度为 k 的二叉树上至多含 2k-1 个结点(k≥1)
证明:
基于上一条性质,深度为 k 的二叉 树上的结点数至多为
20+21+ +2k-1 = 2k-1
.
18
性质 3 :
对任何一棵二叉树,若它含有n0 个叶
子结点、n2 个度为 2 的结点,则必存在
关系式:n0 = n2+1
证明:
设 二叉树上结点总数 n = n0 + n1 + n2
又 二叉树上分支总数 b = n1 + 2n2
ห้องสมุดไป่ตู้
而 b = n-1 = n0 + n1 + n2 - 1
由此, n0 = n2 + 1 .
19
两类特殊的二叉树:
1
满二叉树:指的是
2
3
深度为k且含有2k-1个 4 5 6 7
结点的二叉树。
8 9 10 11 12 13 14 15
.
12
6.2 二叉树的类型定义
.
13
二叉树或为空树;或是由一个根结
点加上两棵分别称为左子树和右子树
的、互不交的二叉树组成。
根结点
A
右子树
B
E
C
F
左子树
D
.
G H K 14
二叉树的五种基本形态:
空树
只含根结点
N
右子树为空树 左子树为空树
左右子 树均不 为空树
N
N
N
L
RL
R
.
15
二叉树 的重要特性
} BiTNode, *BiTree;
结点结构: lchild data rchild
.
28
2.三叉链表
结点结构:
root
parent lchild data rchild
A B
C
D
E
F
.
29
C 语言的类型描述如下:
typedef struct TriTNode { // 结点结构 TElemType data; struct TriTNode *lchild, *rchild; // 左右孩子指针 struct TriTNode *parent; //双亲指针
} TriTNode, *TriTree;
结点结构: parent lchild data rchild
.
16
性质 1 : 在二叉树的第 i 层上至多有2i-1 个结点。 (i≥1)
用归纳法证明:
归纳基: i = 1 层时,只有一个根结点, 2i-1 = 20 = 1;
归纳假设:假设对所有的 j,1≤ j i,命题成立;
归纳证明:二叉树上每个结点至多有两棵子树,
则第 i 层的结点数 = 2i-2 2 = 2i-1 。
因为
k
只能是整数,因此,
.
k
=log2n
+
21
1
性质 5 :
若对含 n 个结点的完全二叉树从上到下且从左至
右进行 1 至 n 的编号,则对完全二叉树中任意一
个编号为 i 的结点:
(1) 若 i=1,则该结点是二叉树的根,无双亲, 否
则,编号为 i/2 的结点为其双亲结点;
(2) 若 2i>n,则该结点无左孩子,
否则,编号为 2i 的结点为其左孩子结点;
(3) 若 2i+1>n,则该结点无右孩子结点,
否则,编号为2i+1 的结点为其右孩子结点。
.
22
6.3
二叉树的存储结构
一、 二叉树的顺序 存储表示
二、二叉树的链式
存储表示
.
23
一、 二叉树的顺序存储表示
#define MAX_TREE_SIZE 100 // 二叉树的最大结点数
.
1
6.1 树的类型定义
6.2 二叉树的类型定义
6.3 二叉树的存储结构
6.4 二叉树的遍历
6.5 线索二叉树
6.6 树和森林的表示方法
6.7 树和森林的遍历
6.8 哈夫曼树与哈夫曼编码
.
2
6.1 树的类型定义
.
3
数据对象 D:
D是具有相同特性的数据元素的集合。
数据关系 R:
若D为空集,则称为空树;
完全二叉树:树
a
中所含的 n 个结点 和满二叉树中编号 为 1 至 n 的结点一
b de
c fg
一对应。
hi j .
20
性质 4 :
具有 n 个结点的完全二叉树的深度
为 log2n +1
证明:
设 完全二叉树的深度为 k
则根据第二条性质得 2k-1≤ n < 2k
即 k-1 ≤ log2 n < k
结点的度: 分支的个数
树的度: 树中所有结点的度的最大值
叶子结点: 度为零的结点
D
HI J
分支结点: 度大于零的结点
.
7M
(从根到结点的)路径:
由从根到该结点 所经分支和结点构
A
B
C
D
成
E F GH I J
孩子结点、双亲结点、 K L
M
兄弟结点、堂兄弟
祖先结点、子孙结点
结点的层次: 假设根结点的层次为1,第l 层
typedef TElemType
SqBiTree[MAX_TREE_SIZE]; // 0号单元存储根结点
SqBiTree bt;
.
24
例如:
0
A
1
B
4
C
2
D
6
E
13
F
0 1 2 3 4 5 6 7 8 9 10 11 12 13
AB D C E
F
.
25
二、二叉树的链式存储表示
1. 二叉链表 2.三叉链表
否则:
(1) 在D中存在唯一的称为根的数据元素root,
(2) 当n>1时,其余结点可分为m (m>0)个互
不相交的有限集T1, T2, …, Tm, 其中每一 棵子集本身又是一棵符合本定义的树,
称为根root的子树。.
4
例如:
A
B
C
D
E
F GH I J
K
L
M
.
5
基本术语
.
6
结点: 数据元素+若干指向子树的分支