第06章树和二叉树(Java版)
数据结构第六章树和二叉树.ppt

A 线性结构
栈
队 1.数据的逻辑结构
数 据
树形结构 B 非线性结构
结
构
图形结构
的
三 个
2、数据的存储结构 A 顺序存储
方 面
B 链式存储
3、数据的运算:检索、排序、插入、删除、修改等。
第六章 树和二叉树
6.1 树的定义和基本术语 6.2 二叉树
6.2.1 二叉树的定义 6.2.2 二叉树的性质 6.2.3 二叉树的存储结构
TraverseTree ( T,Visit() ) ; 初始条件:树t存在, Visit是对结点操作的应用函数。 操作结果:按某种次序对T的每个结点调用函数Visit ()一次且至 多一次。一旦Visit ()失败,则操作失败。
堂兄弟——其双亲在同一层的结点互为堂兄弟。K L
M
结点的层次(level)——从根结点算起,根为第一层,它的孩子为第二层…。
深度(depth)——树中结点的最大层次数。
森林(forest)——m(m0)棵互不相交的树的集合。
树的抽象数据类型定义:
ADT Tree{ 数据对象D:D是具有相同特性的数据元素的集合。 数据关系R:若D为空集,则称为空树; 若D仅含一个数据元素,则R为空集,否则R={H},H是如下二元关系: (1)在D中存在唯一的称为根的数据元素root,它在关系H下无前驱; (2)若D-{root}≠Ф,则存在D-{root}的一个划分D1, D2, ..., Dm (m>0),对任意j≠k(1≤j,k≤m)有Dj∩Dk=φ ,且对任意 的i(1≤i≤m),唯一存在数据元素xi∈Di,有<root,xi> ∈ H; (3)对应于D-{root}的划分,H-{<root,x1>,....,<root,xm>} 有唯一的一个划分H1 , H2 ,..., Hm (m>0),对任意j≠k (1≤j,k≤m)有Hj∩Hk=Ф ,且对任意的i(1≤i≤m),Hi 是Di上 的二元关系,(Di ,{Hi})是一棵符合本定义的树,称为根root的子 树。
第6章 树和二叉树

二叉树的存储结构
1. 二叉树的顺序存储表示
DeleteChild( T, p, LR ); 初始条件:二叉树 T 存在。 操作结果:根据LR的值,删除结点p的子树。
✓ 加工型操作(续)
Assign( T, &e, value ) 初始条件:二叉树 T 存在。 操作结果:用 value 给当前结点 e 赋值。
ClearBiTree( &T ) 初始条件:二叉树 T 存在。 操作结果:清空二叉树中的所有结点。
Value( T, cur_e ) 初始条件:树 T 存在。 操作结果:用 cur_e 返回当前结点的元素值。
Parent( T, cur_e ) 初始条件:树 T 存在。 操作结果:用 cur_e 返回当前结点双亲的元素值。
✓ 引用型操作(续)
LeftSibling( T, cur_e ) 初始条件:树 T 存在。 操作结果:用 cur_e 返回当前结点左兄弟的元素值。
证明:
设二叉树上结点总数 n = n0 + n1 + n2,二叉树上分支总数 (总度数) b = n1+2n2,而 b = n-1 = n0 + n1 + n2 – 1,由此, n0 = n2 + 1。
除根结点外,每个结 点指向双亲结点的分
支只有一条。
两类特殊的二叉树:
满二叉树(Full Binary Tree) :指的是深度为 k 且含有 2k-1 个结点的二 叉树。
第6章树与二叉树-

F3
7
G6
8
H6
9
K6
8
2. 孩子表示法
由于树中每个结点可能有多棵子树,则可以用多重 链表,即每个结点有多个指针域,其中每个指针指向一 棵子树的根结点,此时,链表中的结点可以有如下 3 种 结构格式:
同构结点格式 不同构结点格式 单链表存储结构
9
(1) 同构结点格式。即多重链表中的结点是同构的。
完全二叉树:一棵深度为 k 并且有 n 个结点的二叉 树,当且仅当其每一个结点都与深度为 k 的满二叉树中 编号从 1 至 n 的结点一一对应时,称之为完全二叉树。
完全二叉树的特点是:二叉树中的叶子结点只可能 出现在二叉树中层次最大的两层上;最下一层的结点一 定是从最左边开始向右放的;并且若某个结点没有左孩 子,则它一定没有右孩子。
为 2 的结点有两个出支,则:B = n1 + 2n2 故:n = n1 + 2n2 + 1;最后得到: n0 = n2 + 1。
20
为便于介绍下面两个二叉树性质,先了解满二叉树 (full binary tree) 和完全二叉树 (complete binary tree) 的 概念。
满二叉树:一棵深度为 k 并且有 2k-1 个结点的二叉 树,称之为满二叉树。
23
性质5:如果对一棵有 n 个结点的完全二叉树(此二 叉树的深度为 log2n +1)的结点按照层次编号(从第 1 层到第 log2n +1 层,每层从左到右),那么对任一结点 i(1 ≤i ≤n),有
(1) 若 i = 1,则结点 i 是二叉树的根,没有双亲结点; 若 i >1,则其双亲结点是结点 i / 2。
(2) 若 2i >n,则结点 i 没有左孩子(结点 i 为叶子结 点);否则其左孩子是结点 2i。
数据结构第6章树和二叉树基本概念和二叉树ppt课件

§6.2 二叉树
❖二叉树的定义
或者是空树,或者是由一个根结点加上两棵 分别称为左子树和右子树的、互不相交的二叉树 组成。
二叉树的结点的子树要区分左子树和右子树, 即使在结点只有一棵子树的情况下也要明确指出 该子树是左子树还是右子树。
§6.2 二叉树
❖二叉树的定义
逻辑结构: 一对二(1:2) 基本特征: ① 每个结点最多只有两棵子树(不存在度大于2的结点) ② 左子树和右子树次序不能颠倒(有序树)。 基本形态:
§6.1 树的基本概念
❖树的基本术语
结点 ——即树的数据元素 结点的度 ——结点挂接的子树数
(有几个直接后继就是几度, 亦称“次数”) 结点的层次 ——从根到该结点的层数(根结点算第一层) 终端结点 ——即度为0的结点,即叶子 分支结点 ——即度不为0的结点(也称为内部结点) 树的度 ——所有结点度中的最大值(Max{各结点的度}) 树的深度 ——指所有结点中最大的层数(Max{各结点的层次}) (或高度)
二叉树的运算仍然是插入、删除、修改、查找、排序等,但这些操 作必须建立在对树结点能够“遍历”的基础上! (遍历——指每个结点都被访问且仅访问一次,不遗漏不重复)。
§6.2 二叉树
❖二叉树的性质
讨论1:第i层的结点数至多是多少? 2i-1个
1
2
3
(二进制性质)
4
5
6
7
8 9 10 11 12 13 14 15
特点:每层都“充满”了结点
§6.2 二叉树
❖两种特殊形式的二叉树
完全二叉树:树中所含的n个结点和满二叉树中编号 为1至n的结点一一对应
(例如删除A后的子树个数) 有序树 ——结点各子树从左至右有序,不能互换(左为第一) 无序树 ——结点各子树可互换位置。
06树与二叉树详解2PPT课件

12.11.2020
2
本讲主要介绍以下几个方面的内容: • 树的定义及基本概念; • 树、森林与二叉树之间的相互转换; • 树的各种存储结构; • 树、森林的遍历。
12.11.2020
3
6.1 树 的 概 述
6.1.1 树的定义及特性
所谓“树(Tree)”是指由n(n≥0) 个结点构成的有限数据元素的集合T。当n=0 时,称其为“空树”。当n≠0时,树中诸结 点应该满足下面的两个条件:
只有无右子树的二叉树,才能通过转换 成为一棵树。具体步骤如下:
(1)找到二叉树中某结点的右孩子及右 孩子的右孩子……,在它们与该结点的双亲 结点之间添加连线;
树中度大于0的结点称为分支结点,或 非终端结点。
12.11.2020
12
• 路径 从树中一个结点到另一个结点之间的分
支,称为这两个结点间的路径。 • 路径长度
一条路径上的分支数,称为该路径的长 度。
12.11.2020
13
2.有关结点间关系的术语
• 根结点 所谓“根”结点,即是指树中没有直接
前驱的那个结点。一棵树,只能有一个根结 点。 • 孩子结点
棵树的度。 • 树的深度
一棵树中各结点的深度的最大值,称为 该树的深度。树的深度有时也称为树的高度。
12.11.2020
17
• 有序树与无序树 如果限定树中各结点的子树从左至右的
排列具有一定顺序,不得互换,那么就称该 树是有序的,否则称为是无序树。 • 森林
n(n≥0)棵互不相交的树的集合,称 为森林。
12.11.2020
22
例:将图6-6(a)所示的树,转换成它所 对应的二叉树。
12.11.2020
23
第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个结点仅有右孩子,求出该二叉树的结点数目。
第06章树和二叉树(Java版)

5.
约定遍历子树的次序是先左子树后右子树
《数据结构(Java版)(第4版)》第6章 13
1. 孩子优先的遍历规则
先根次序:访问根结点,遍历左子树,遍历右子树。 中根次序:遍历左子树,访问根结点,遍历右子树。 后根次序:遍历左子树,遍历右子树,访问根结点。 先根遍历序列:A B D G C E F H 中根遍历序列:D G B A E C H F 后根遍历序列:G D B E H F C A
《数据结构(Java版)(第4版)》第6章 7
6.2.1 二叉树定义 二叉树(binary tree)是n个结点的有限集合: 空二叉树; 由一个根结点、两棵互不相交的左子树和右子树组成。
《数据结构(Java版)(第4版)》第6章 8
【思考题6-1】① 二叉树与树的差别
二叉树是不是度为2的树?二叉树是不是度为2的有序树?为什么?
孩子
//插入x为parent结点的左/右
left data right
root
A
parent B
left data right
root
A
B∧
C
parent
X∧
X∧
∧E∧
∧Y
∧D
∧D
F∧
∧G∧
(a)创建X结点作为parent的左孩子, parent的原左孩子D作为X结点的左孩子
∧G∧
∧H∧
(b)创建Y结点作为parent的右孩子, parent的原右孩子F作为Y结点的右孩子
3. 二叉树的先根、中根和后 根次序遍历算法
《数据结构(Java版)(第4版)》第6章 14
2. 兄弟优先的遍历规则 层次遍历序列: ABCDEFGH
《数据结构(Java版)(第4版)》第6章 15
第6章树和二叉树

23
§6.3 遍历二叉树
• 遍历二叉树 • 遍历二叉树的递归与非递归算法 • 表达式求值 • 二叉树的运算举例 • 层序遍历二叉树
计算机科学与技术学院——数据结构
24
§6.3 遍历二叉树
§6.3.2 遍历二叉树的递归与非递归算法(1)
先序遍历二叉树
若二叉树为空,则空操作;否则
根
访问根;
先序遍历左子树;
具有三个结点的树与二叉树
A、三个结点的树有两种不同的形态
B、三个结点的二叉树有五种不同的形态
树型结构的共同特征:层次性、分支性
计算机科学与技术学院——数据结构
10
§6.2 二叉树
§6.2.1 二叉树的定义(3)
二叉树的基本操作
初始化空二叉树 销毁二叉树 创建二叉树 清空二叉树 判断空二叉树 求二叉树深度 求双亲 求左孩子 求右孩子 求左兄弟 求右兄弟 插入子树 删除子树 先序遍历二叉树 中序遍历二叉树 后序遍历二叉树 按层次遍历
InitTree(&T); DestroyTree(&T); CreateTree(&T, definition); ClearTree(&T); TreeEmpty(T); TreeDepth(T); parent(T, cur_e); LeftChild(T, cur_e); RightSibling(T, cur_e); InsertChild(&T, &p, i, c); DeleteChild(&T, &p, i); TraverseTree(T, visite());
∧G ∧
三叉链表表示
计算机科学与技术学院——数据结构
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构(Java版)(第4版)》第6章 19
2. 二叉树叉链表
《数据结构(Java版)(第4版)》第6章 17
ADT BinaryTree<T>
BinaryNode<T> insert(T x) //插入根
BinaryNode<T> insert(BinaryNode<T> p, T x,
void remove(BinaryNode<T> parent, boolean
void remove(TreeNode<T> p, int i) //删除子树
void clear()
//删除所有结点
TreeNode<T> search(T key) boolean contains(T key) T remove(T key) }
//查找 //包含 //删除子树
6.2 二叉树 6.2.1 二叉树定义 6.2.2 二叉树性质 6.2.3 二叉树的遍历 6.2.4 二叉树抽象数据类型 6.2.5 二叉树的存储结构 6.2.6 二叉树的二叉链表实现
3. 二叉树的先根、中根和后 根次序遍历算法
《数据结构(Java版)(第4版)》第6章 14
2. 兄弟优先的遍历规则 层次遍历序列: ABCDEFGH
《数据结构(Java版)(第4版)》第6章 15
习6-16(a)
给出二叉树的先根、中根、后根和层次遍历序列。
A
B
C
D
E
F
G
H
I
J
K
《数据结构(Java版)(第4版)》第6章 16
5.
约定遍历子树的次序是先左子树后右子树
《数据结构(Java版)(第4版)》第6章 13
1. 孩子优先的遍历规则
先根次序:访问根结点,遍历左子树,遍历右子树。 中根次序:遍历左子树,访问根结点,遍历右子树。 后根次序:遍历左子树,遍历右子树,访问根结点。 先根遍历序列:A B D G C E F H 中根遍历序列:D G B A E C H F 后根遍历序列:G D B E H F C A
//树抽象数据类型
//判空 //层次 //结点数 //高度 //先根次序遍历 //后根次序遍历 //层次遍历
ADT Tree<T>
TreeNode<T> insert(T x) //插入元素x作为根
TreeNode<T> insert(TreeNode<T> p, T x, int i)
//插入x作为p结点的第i(≥0)个孩子
void clear()
//删除所有结点
BinaryNode<T> search(T key) //查找
boolean contains(T key) //包含
int level(T key)
//key结点所在层次
}
boolean leftChild) leftChild)
//插入孩子 //删除子树
《数据结构(Java版)(第4版)》第6章 7
6.2.1 二叉树定义 二叉树(binary tree)是n个结点的有限集合: 空二叉树; 由一个根结点、两棵互不相交的左子树和右子树组成。
《数据结构(Java版)(第4版)》第6章 8
【思考题6-1】① 二叉树与树的差别
二叉树是不是度为2的树?二叉树是不是度为2的有序树?为什么?
6.1 树及其抽象数据类型
6.1.1 树定义
A
B
C
D
E
F
G
HI J
树(tree)是由n(n≥0)个结点组成的有限集合。n=0的树称为空树;n>0的树T: 根(root)结点,它没有前驱结点。 其他结点分为m棵互不相交的子树。
6.1.2 树的术语
1.
父母、孩子与兄弟结点
2.
度
3.
结点层次、树的高度
2个结点的树和二叉树的基本形态
《数据结构(Java版)(第4版)》第6章 9
【思考题6-1】②
画出3个结点的树和二叉树的基本形态。
(a)3个结点的树有2种形态
(b)3个结点的二叉树有5种形态
《数据结构(Java版)(第4版)》第6章 10
6.2.2 二叉树性质 性质1:若根结点的层次为1,则二叉树第i层最多有2i 1(i≥1)个结点。 性质2:在高度为h的二叉树中,最多有2h 1个结点(h≥0)。 性质3:设一棵二叉树的叶子结点数为n0,2度结点数为n2,则n0=n2+1。
若2i+2<n,则i的右孩子结点在2i+2;否则i无右孩子。
(i1)/2
【实验题6-3】完全二叉树类
《数据结构(Java版)(第4版)》第6章 12
6.2.3 二叉树的遍历规则
1.
孩子优先的遍历规则
2.
所有遍历序列有6种:
3.
ABC,BAC,BCA, //先左孩子
4.
CBA,CAB,ACB。 //先右孩子
6.2.4 二叉树抽象数据类型
ADT BinaryTree<T> {
boolean isEmpty() int size() int height() void preorder() void inorder() void postorder() void levelorder()
//判空 //结点数 //高度 //先根次序遍历 //中根次序遍历 //后根次序遍历 //按层次遍历
4.
边、路径
5.
无序树、有序树
6.
森林
6.1.3 树抽象数据类型
ADT Tree<T> {
boolean isEmpty() int level(T key) int size() int height() void preorder() void postorder() void levelorder()
《数据结构(Java版)(第4版)》第6章 11
完全二叉树
性质4:一棵具有n个结点的
hlogn1 完全二叉树,其高度为
性质5:一棵具有n个结点的完全二叉树,对序号为i(0≤i<n)的结点,有:
2
若i=0,则i为根结点,无父母结点;
若i>0,则i的父母结点序号为
若2i+1<n,则i的左孩子结点在2i+1;否则i无左孩子。
《数据结构(Java版)(第4版)》第6章 18
6.2.5 二叉树的存储结构
1.
二叉树的顺序存储结构
0 A
1
2
B
C
3
45
6
D
E
F
G
7 H
(a)一棵完全二叉树
0A 1B 2C 3D 4E 5F 6G n-1 H
二叉树的性质5 (i-1)/2,父母
i
2*i+1<n,左孩子 2*i+2<n,右孩子
(b)完全二叉树的顺序存储结构