第06章 树和二叉树(Java版)
树与二叉树h
SBNode nodes[MAXSIZE]; } SBTree;
举例
结点 左子
右子
1
26 34
1
2
6
2
3
4
3
0
4
4
0
0
4
4
0
0
特点:
6
0
0
找子方便,找父 结点不便.
三、二叉链表存储结构
第一层 第二层
( A ( B ( E (K,L),F),C(G),D( H (M),I,J )))
第四层 第三层
二、基本术语
结点:包括一个数据元素及若干个指向其它子树 的分支;例如,A,B,C,D等。
叶结点:无后件结点为叶结点;如K,L,M。 根结点:无前件的结点为根;例如,A结点。
子结点:某结点后件为该结点的子结点;例如,
方法描述: 从根结点a开始访问, 接着访问左子结点b, 最后访问右子结点c。
即:
根
A 访问根结点 B 先序遍历左子树 C 先序遍历右子树
a
左子 右子
bc
二、中序法(InOrder)
方法描述:
从左子结点b开始访问,
接着访问根结点a,
最后访问右子结点c。
即:
根
A 中序遍历左子树 B 访问根结点 C 中序遍历右子树
计算机学院
自动化学院
各种社会组织机构;
在计算机领域中,用树表示源
程序的语法结构;
2101 2102
2103
在OS中,文件系统、目录等组
织结构也是用树来表示的。
树和二叉树——精选推荐
第6章 树和二叉树内容概要:本章主要介绍树,二叉树,最优二叉树的相关概念和操作,存储结构和相应的操作,并在综合应用设计中,给出了对应算法的C 语言实现。
教学目标1.理解各种树和森林与二叉树的相应操作。
2.熟练掌握二叉树的各种遍历算法,并能灵活运用遍历算法实现二叉树的其他操作。
3.熟练掌握二叉树和树的各种存储结构及其建立的算法。
4.掌握哈夫曼编码的方法。
5.通过综合应用设计,掌握各种算法的C 语言实现过程。
基本知识点:树和二叉树的定义、二叉树的存储表示、二叉树的遍历以及其它操作的实现、树和森林的存储表示、树和森林的遍历以及其它操作的实现、最优树和赫夫曼编码重点:二叉树的性质、二叉树的遍历及其应用,构造哈夫曼树。
难点:编写实现二叉树和树的各种操作的递归算法。
本章知识体系结构:课时安排:6个课时树的定义 树树的性质 树的逻辑表示法 树形表示法 树的存储结构 双亲存储结构 文氏表示法凹入表示法 括号表示法 孩子存储结构 孩子双亲存储结构二叉树二叉树的定义 二叉树的性质二叉树的逻辑表示法(采用树的逻辑表示法)二叉树的存储结构二叉树的顺序存储结构先序遍历 中序遍历 后序遍历二叉树的遍历 二叉树的链式存储结构(二叉链) 由先序序列和中序序列构造二叉树 由中序序列和后序序列构造二叉树二叉树的构造 二叉树的线索化 哈夫曼树二叉树和树之间的差别 二叉树与树、森林之间的转换二叉树和树课程数据结构教学教具多媒体课件学时2班级06网络教学日期/课时 /2课时教学单元第6章树和二叉树教学方法讲授(PPT)教学目标掌握树、二叉树的基本概念和术语,二叉树的性质教学重点二叉树的定义、二叉树的性质、链式存储结构教学难点二叉树的性质、链式存储二叉树的基本操作组织教学一、树的定义二、树的基本概念三、二叉树的定义、性质四、二叉树的顺序存储结构和链式存储结构五、小结作业复习本讲内容并预习下一讲内容课堂情况及课后分析课程数据结构教学教具多媒体课件学时2班级06网络教学日期/课时 /2课时教学单元第6章树和二叉树教学方法讲授(PPT)教学目标掌握二叉树遍历的三种方法及二叉树的基本操作教学重点二叉树的遍历算法教学难点中序与后序遍历的非递归算法组织教学一、复习二叉树的定义二、遍历二叉树的三种方法三、递归法遍历二叉树四、二叉树的基本操作五、总结作业复习本讲内容并预习下一讲内容课堂情况及课后分析课程数据结构教学教具多媒体课件学时2班级06网络教学日期/课时 /2课时教学单元第6章树和二叉树教学方法讲授(PPT)教学目标理解树与森林的转换,掌握哈夫曼树教学重点哈夫曼树教学难点树与森林的转换组织教学一、导入二、树与森林三、哈夫曼树四、小结作业习题6课堂情况及课后分析前面几章讨论的数据结构都属于线性结构,线性结构的特点是逻辑结构简单,易于进行查找、插入和删除等操作,可用于描述客观世界中具有单一前驱和后继的数据关系。
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
java数据结构之树
java数据结构之树树定义和基本术语定义:树(Tree)是n(n≥0)个结点的有限集T,并且当n>0时满足下列条件:(1)有且仅有一个特定的称为根(Root)的结点;(2)当n>1时,其余结点可以划分为m(m>0)个互不相交的有限集T1、T2 、…、Tm,每个集Ti(1≤i≤m)均为树,且称为树T的子树(SubTree)。
特别地,不含任何结点(即n=0)的树,称为空树。
如下就是一棵树的结构:基本术语结点:存储数据元素和指向子树的链接,由数据元素和构造数据元素之间关系的引用组成。
孩子结点:树中一个结点的子树的根结点称为这个结点的孩子结点,如图1中的A的孩子结点有B、C、D双亲结点:树中某个结点有孩子结点(即该结点的度不为0),该结点称为它孩子结点的双亲结点,也叫前驱结点。
双亲结点和孩子结点是相互的,如图1中,A的孩子结点是B、C、D,B、C、D的双亲结点是A。
兄弟结点:具有相同双亲结点(即同一个前驱)的结点称为兄弟结点,如图1中B、B、D 为兄弟结点。
结点的度:结点所有子树的个数称为该结点的度,如图1,A的度为3,B的度为2.树的度:树中所有结点的度的最大值称为树的度,如图1的度为3.叶子结点:度为0的结点称为叶子结点,也叫终端结点。
如图1的K、L、F、G、M、I、J分支结点:度不为0的结点称为分支结点,也叫非终端结点。
如图1的A、B、C、D、E、H结点的层次:从根结点到树中某结点所经路径的分支数称为该结点的层次。
根结点的层次一般为1(也可以自己定义为0),这样,其它结点的层次是其双亲结点的层次加1.树的深度:树中所有结点的层次的最大值称为该树的深度(也就是最下面那个结点的层次)。
有序树和无序树:树中任意一个结点的各子树按从左到右是有序的,称为有序树,否则称为无序树。
树的抽象数据类型描述数据元素:具有相同特性的数据元素的集合。
结构关系:树中数据元素间的结构关系由树的定义确定。
基本操作:树的主要操作有(1)创建树IntTree(&T) 创建1个空树T。
树和二叉树PPT课件
有两归个纳孩基子:结点i =,1则层每时一,层只均有比一上个一根层结的点结,点个数多一
倍。
2i-1 = 20 = 1;
归纳假设:假设对所有的 j,1≤ j i,命题成立;
按照归等纳比证数明列:的二定叉义树,上每每一个项结都点可至以多看有作两是棵相子应树每,一则层第
上的结点个数,i 则层,的a结i=点ai*数qi-1=22i-1i-2 2 = 2i-1 。
Dl,Dr
(3)若Dl , Dr都不为空集,则Dl , Dr本身又是一棵符 合
本定义的二叉树,称为根root的左右子树。
基本操作P:(见教材)
17
} ADT BinaryTree
二叉树的5种基本形态
二叉树的定义
A
A
A
A
B
B
BC
(a)
(b)
(c)
(d)
(e)
空二叉树
根和空的 根和左子树 根和右子树 左右子树
线性表和广义表 栈和队列 数组和广义表
树
……
线性表 广义表
栈
队列 ……
8
树的定义
树的定义
树是由n (n 0)个结点组成的有限集合。 如果n = 0,称为空树; 如果n > 0,则:
有一个特定的称之为根(root)的结点,它只有后继,但没有前
驱;
除根以外的其它结点划分为m(m>0)个互不相交的有限集合T1, T2, …, Tm。
10
树的定义
抽象数据类型树的定义
ADT Tree { 数据对象D:D是具有相同特性的数据元素的集合。 数据关系R:若D为空集,则称为空树; 否则: (1) 在D中存在唯一的称为根的数据元素root, (2) 当n>1时,其余结点可分为m (m>0)个互
java实现二叉树的基本操作
java实现二叉树的基本操作一、二叉树的定义树是计算机科学中的一种基本数据结构,表示以分层方式存储的数据集合。
树是由节点和边组成的,每个节点都有一个父节点和零个或多个子节点。
每个节点可以对应于一定数据,因此树也可以被视作提供快速查找的一种方式。
若树中每个节点最多只能有两个子节点,则被称为二叉树(Binary Tree)。
二叉树是一种递归定义的数据结构,它或者为空集,或者由一个根节点以及左右子树组成。
如果左子树非空,则左子树上所有节点的数值均小于或等于根节点的数值;如果右子树非空,则右子树上所有节点的数值均大于或等于根节点的数值;左右子树本身也分别是二叉树。
在计算机中实现二叉树,通常使用指针来表示节点之间的关系。
在Java中,定义一个二叉树节点类的代码如下:```public class BinaryTree {int key;BinaryTree left;BinaryTree right;public BinaryTree(int key) {this.key = key;}}```在这个类中,key字段表示该节点的数值;left和right字段分别表示这个节点的左右子节点。
1. 插入节点若要在二叉树中插入一个节点,首先需要遍历二叉树,找到一个位置使得插入新节点后,依然满足二叉树的定义。
插入节点的代码可以写成下面这个形式:```public void insert(int key) {BinaryTree node = new BinaryTree(key); if (root == null) {root = node;return;}BinaryTree temp = root;while (true) {if (key < temp.key) {if (temp.left == null) {temp.left = node;break;}temp = temp.left;} else {if (temp.right == null) {temp.right = node;break;}temp = temp.right;}}}```上面的代码首先创建了一个新的二叉树节点,然后判断二叉树根是否为空,若为空,则将这个节点作为根节点。
Java数据结构-树与二叉树
}else{
//一个递归调用删除左子树的最左节点 left = left.removeLeftmost(); return this;
} }
练习
提供复制一棵二叉树的方法 public static TreeNode treeCopy(TreeNode source)
root root level=1
A
A
B
C
D
level=2
depth=3
E
(a) n=0 空树 (b) n=1 树中只有一个根结点
F
G
H
(c) n=10,度为3的树
I
J
level=3
树的术语
结点 孩子结点与双亲结点 兄弟结点 祖先结点与后代结点 结点的度 叶子结点与分支结点 树的度
二叉树的定义及性质
二叉树的定义 二叉树的性质 二叉树的存储结构 声明二叉树类
二叉树的定义
二叉树的递归定义 二叉树(binary tree)是n(n≥0)个结 点组成的有限集合。n=0时称为空二叉树; n>0的二叉树由一个根结点和两棵互不相 交的、分别称为左子树和右子树的子二 叉树构成。
二叉树的基本形态
3个结点树与二叉树的基本形态
if (left==null) {
return data;
} else {
return left.getLeftmostData();
}
} //如何删除最左节点或最右节点? 提示:
二叉树类节点
//删除最左或最右节点
public TreeNode removeLeftmost(){
if(left==null){
《数据结构(Java)》树和二叉树
7.1.4 树的存储结构
1.双亲表示法
双亲表示法就是用指针表示出每个结点的双亲结点。
对于使用仿真指针的双亲表示法来
A
说,每个结点应有两个域,一个是
数据元素域,另一个是指示其双亲
B
C
结点在数组中下标序号的仿真指针域。
图 7-3:树及其使用方法仿真指针的 D E F G
双亲表示法。
2 孩子表示法
H
I
data parent
0A
-1
1B
0
2C
0
3D
1
4E
1
5F
1
6G
2
7H
4
8I
4
孩子表示法就是用指针表示出每 个结点的孩子结点。
(a)
(b)
图 7-3
《数据结构》教案——符策锐
第 68 页
教学过程
常规指针的孩子表示法
root
A
∧
B
C
∧∧
D ∧∧ ∧
Hale Waihona Puke E∧F ∧∧∧
G ∧∧∧
H ∧∧∧
3.双亲孩子表示法
I ∧∧∧
双亲孩子表示法就是用指针既表示出每个结点的双亲结点,也表示出
第 69 页
教学过程
root
A∧
B
C∧
∧D
E
∧F ∧
∧ G∧
∧H
∧ I∧
在使用孩子兄弟表示法的存储结构中,每个结点最多只有两个指针域, 并且这两个指针含义不同,所以孩子兄弟表示法对应的实际是一种二叉树。
孩子兄弟表示法的最大优点是可以按照二叉树的处理方法来处理树。
§7.2 二叉树
7.2.1 二叉树的定义 二叉树是 n(n≥0)个结点构成的、每个结点最多只有两个子树的有序 树。 也可以说,二叉树是这样一种有序树,其中每个结点最多只有一个直 接前驱结点,但最多可以有两个直接后继结点。 二叉树中所有结点的形态共有 5 种:空结点、无左右子树结点、只有 左子树结点、只有右子树结点和左右子树均存在的结点。
数据结构第6章树和二叉树
数据结构第6章树和⼆叉树第六章树和⼆叉树⼀、选择题1.已知⼀算术表达式的中缀形式为 A+B*C-D/E,后缀形式为ABC*+DE/-,其前缀形式为( )A.-A+B*C/DE B. -A+B*CD/E C.-+*ABC/DE D. -+A*BC/DE2.设树T的度为4,其中度为1,2,3和4的结点个数分别为4,2,1,1 则T中的叶⼦数为()A.5 B.6 C.7 D.83.在下述结论中,正确的是()①只有⼀个结点的⼆叉树的度为0; ②⼆叉树的度为2;③⼆叉树的左右⼦树可任意交换;④深度为K的完全⼆叉树的结点个数⼩于或等于深度相同的满⼆叉树。
A.①②③ B.②③④ C.②④ D.①④4.设森林F对应的⼆叉树为B,它有m个结点,B的根为p,p的右⼦树结点个数为n,森林F中第⼀棵树的结点个数是()A.m-n B.m-n-1 C.n+1 D.条件不⾜,⽆法确定5.⼀棵完全⼆叉树上有1001个结点,其中叶⼦结点的个数是()A.250 B. 254 C.500 D.5016.设给定权值总数有n 个,其哈夫曼树的结点总数为( )A.不确定 B.2n C.2n+1 D.2n-17.有关⼆叉树下列说法正确的是()A.⼆叉树的度为2 B.⼀棵⼆叉树的度可以⼩于2 C.⼆叉树中⾄少有⼀个结点的度为2 D.⼆叉树中任何⼀个结点的度都为2 8.⼆叉树的第I层上最多含有结点数为()A.2I B. 2I-1-1 C. 2I-1 D.2I -19.⼀个具有1025个结点的⼆叉树的⾼h为()A.11 B.10 C.11⾄1025之间 D.10⾄1024之间10.⼀棵⼆叉树⾼度为h,所有结点的度或为0,或为2,则这棵⼆叉树最少有( )结点A.2h B.2h-1 C.2h+1 D.h+111.⼀棵具有 n个结点的完全⼆叉树的树⾼度(深度)是()A.?log2n?+1 B.log2n+1 C.?log2n? D.log2n-112.深度为h的满m叉树的第k层有()个结点。
数据结构(Java版) 模块5 树和二叉树2
哈夫曼树及其应用
哈夫曼编码过程
① 用c1, c2,…, cn作为叶子,ω1, ω2,…, ωn作为各 叶子的权,构造一棵哈夫曼树;
② 在哈夫曼树中,在左分支上标上代码0,在右分支上
标上代码1; ③ 将从根到某叶子ci路径上所经过的分支上的代码顺序 连接起来就可以得到字符ci的二进制编码。
哈夫曼树及其应用
余m-1个结点都有且仅有一条路经,这m-1条路经的路径长 度之和称为树的路径长度,记作PL。
注意:在结点数目相同的二叉树中,完全二叉树的路径长
度最短。
哈夫曼树及其应用
哈夫曼树定义—相关概念2
结点的权:在一些应用中,赋予树中结点的一个有某种意
义的实数,记作ω。 结点的带权路径长度:结点到树根之间的路径长度ι与该
5.6 应用举例 实例1:电文的编码和译码 【问题描述】 利用哈夫曼编码进行数据通信可以大大提高信道利用率, 缩短数据传输时间,降低传输成本。但是,这要求在发送端 通过一个编码系统对待传数据预先编码;在接收端将传来的 数据进行译码(还原)。对于双工信道(即可以双向传输信 息的信道),每端都需要一个完整的编/译码系统。根据用户 给出字符集中的所有字符及其出现的频率(即为此字符的权 值),建立哈夫曼编码树,然后利用哈夫曼编码树将输入的 字符串编码成相应的哈夫曼编码;反之,根据哈夫曼译码原 理将用户所输入的0/1代码串编译成相应的字符串。由此,让 用户方便地实现电文词句的Huffman编码及译码。
结点的权ω的乘积。
树的带权路径长度:如果一棵二叉树具有n个带权的叶子 结点,则称这n个叶子结点的带权路径长度之和为树的带权 路径长度,也称为树的代价,通常记作WPL。
其中,ωi和ιi分别是第i个叶子结点的权和根到该叶子的路径长度。
Java数据结构学习之二叉树
Java数据结构学习之⼆叉树⼀、背景知识:树(Tree)在之前的笔记中,我们介绍的链表、栈、队列、数组和字符串都是以线性结构来组织数据的。
本篇笔记要介绍的树采⽤的是树状结构,这是⼀种⾮线性的数据组织形式。
树结构由节点和边构成,且不存在环。
我们曾在线性表型的数据结构中介绍过循环链表和循环队列,这两种数据结构使得存储容器中的元素形成⼀个闭环,具体可参看“数据结构学习笔记”系列的相关博⽂,链接贴在下⾯:树状结构与线性结构最重要的区别在于:树只能有分叉,不能有闭环。
如下图所⽰:树结构不允许有环其实是树的层级性决定的。
树结构中最顶端的结点是根节点,根节点即整棵树的顶级⽗节点。
除了根节点只有⼦节点,最底层的节点只有⽗节点,其余各层的节点都是上层节点的⼦节点、下层节点的⽗节点。
也就是说,树中的数据只与其上下层的数据有关,同层数据间不能有直接联系,这也就是树结构不能有环的原因。
树层级的多少往往被描述为树的⾼度(height),由于我们是从上往下观察树结构的,因此也被描述为树的深度(depth)。
上⾯图⽰中两颗树的深度都是3.⼆、何为⼆叉树(Binray Tree)2.1 ⼆叉树的概念与结构⼆叉树顾名思义,即每个⽗节点最多只有两个分叉的树,这是数据结构领域使⽤频率极⾼的⼀种树结构,这与我们常常⽤⼆元对⽴的观点认识世界的思维习惯有关。
⼆叉树的结构不仅具有层级性,还具有递归性,⼀个⽗节点连接左⼦节点和右⼦节点,⽽左右⼦节点⼜可以作为⽗节点再各⾃连接两个⼦节点,以此类推。
因此⼆叉树是⼀种层次嵌套的数据结构,除了根节点外,树中任意⼀个⽗节点都能作为⼀棵⼦树的根,位于上层⽗节点左侧的⼦树被称为左⼦树,位于右侧的⼦树被称为右⼦树。
⼆叉树体现了⼈们⽤⼆元思维认识⾃然的⽅式。
笔者的本⾏是语⾔学,语⾔学界主流的对句法结构的分析⽅法就是类似于⼆叉树的⼆分法。
拿汉语的句法结构来说,有主谓、述宾、定中、状中、述补等基本的结构类型。
句法结构具有层次嵌套和递归的特点,同时也有对语序的要求,即句法⼆叉树中的左右节点的位置并不是任意的。
数据结构和算法的Java实现二叉树
实现代码:略(具体 实现代码需要根据具 体需求和编程语言进 行编写)
应用场景举例
数据压缩
加密通信
哈夫曼编码是一种广泛使用的数据压缩算法, 它可以用于文件压缩、图像压缩等领域。通 过哈夫曼编码,可以将数据中的冗余信息去 除,从而达到压缩数据的效果。
哈夫曼编码也可以用于加密通信中。在通信 过程中,发送方和接收方可以事先约定好一 套哈夫曼编码规则,然后对传输的数据进行 编码和解码。由于哈夫曼编码具有前缀编码 的特性,因此可以保证数据传输的准确性和 安全性。
AVL树插入操作过程演示
查找插入位置
插入新节点
从根节点开始,按照二叉搜索树的规则查 找插入位置。
在找到的位置插入新节点。
更新节点高度
调整平衡
从插入位置开始,沿着父节点路径向上更 新节点高度。
在更新节点高度的过程中,检查每个节点 的平衡因子,若发现不平衡,则进行相应 的旋转操作以恢复平衡。
AVL树删除操作过程演示
完全二叉树
对于深度为D的二叉树,如果其前D-1层是一个满二叉树,且最后一层(第D层) 的节点都连续集中在左边,则称该二叉树为完全二叉树。
二叉树性质总结
在二叉树的第i层上至多有2^(i-1) 个节点(i≥1)。
深度为k的二叉树至多有2^k - 1 个节点(k≥1)。
对任何一棵二叉树T,如果其终 端节点数为n0,度为2的节点数 为n2,则n0 = n2 + 1。
红黑树删除操作过程演示
删除节点
首先,按照二叉查找树的规则删除指定节点。如果删 除的是黑色节点,需要进行颜色调整和旋转操作以保 持红黑树的性质。
调整颜色与旋转
具体调整过程包括:如果被删除节点的兄弟节点是红色 ,则将其兄弟节点变为黑色,将父节点变为红色,并进 行左旋操作;如果被删除节点的兄弟节点是黑色且其两 个子节点也是黑色,则将其兄弟节点变为红色,并向上 递归调整;如果被删除节点的兄弟节点是黑色且其左子 节点是红色而右子节点是黑色或空节点,则交换兄弟节 点与其左子节点的颜色,并进行右旋操作;最后将被删 除节点的父节点变为黑色,兄弟节点变为红色。
Java数据结构-树与二叉树
二叉树的性质
性质1
若根结点的层次为1,则二叉树第i层的结点数目最多为 2i-1(i≥1)。
性质2
在深度为k的二叉树中,至多有2k-1个结点(k≥0)。
性质3
二叉树中,若叶子结点数为n0,2度结点数为n2,则有 n0=n2+1。
满二叉树与完全二叉树 性质4 4
如果一棵完全二叉树有n个结点,则其深度。
性质5
若将一棵具有n个结点的完全二叉树按顺序表示,对于编号为i(1≤i≤n) 的结点,有如下特点: 若i=1,则i为根结点,无双亲;若i≠1,则i的双亲是编号为i /2的结点。 若2i≤n,则i的左孩子是编号为2i的结点;若2i>n,则i无左孩子。 若2i+1≤n,则i的右孩子是编号为2i+1的结点;若2i+1>n,则i无右孩子。
} public TreeNode getLeft() {
return left;
}
二叉树类节点
public TreeNode setRight(TreeNode right) {
return this.right = right;
} public TreeNode getRight() {
return right;
root root level=1
A
A
B
C
D
level=2
depth=3
E
(a) n=0 空树 (b) n=1 树中只有一个根结点
F
G
H
(c) n=10,度为3的树
I
J
level=3
树的术语
结点 孩子结点与双亲结点 兄弟结点 祖先结点与后代结点 结点的度 叶子结点与分支结点 树的度
第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
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C G
H
6.2.4 二叉树抽象数据类型
ADT BinaryTree<T> { boolean isEmpty() int size() int height() void preorder() void inorder() void postorder() void levelorder()
//判空 //结点数 //高度 //先根次序遍历 //中根次序遍历 //后根次序遍历 //按层次遍历
《数据结构(Java版)(第4版)》第6章 11
完全二叉树
性质4:一棵具有n个结点的 2 完全二叉树,其高度为 性质5:一棵具有n个结点的完全二叉树,对序号为i (0≤i<n)的结点,有:
h log n 1
① 若i=0,则i为根结点,无父母结点; 若i>0,则i的父母结点序号为 (i 1) / 2 ② 若2i+1<n,则i的左孩子结点在2i+1;否则i无左孩子。 ③ 若2i+2<n,则i的右孩子结点在2i+2;否则i无右孩子。
《数据结构(Java版)(第4版)》第6章 9
【思考题6-1】②
画出3个结点的树和二叉树的基本形态。
(a)3个结点的树有2种形态
(b)3个结点的二叉树有5种形态
《数据结构(Java版)(第4版)》第6章 10
6.2.2 二叉树性质
性质1:若根结点的层次为1,则二叉树第i层最 多有2i1(i≥1)个结点。 性质2:在高度为h的二叉树中,最多有2h1个 结点(h≥0)。 性质3:设一棵二叉树的叶子结点数为n0,2度 结点数为n2,则n0=n2+1。
6.2.1 二叉树定义
二叉树(binary tree)是n个结点的有限集合: 空二叉树; 由一个根结点、两棵互不相交的左子树和右 子树组成。
《数据结构(Java版)(第4版)》第6章 8
【思考题6-1】① 二叉树与树的差别
二叉树是不是度为2的树?二叉树是不是 度为2的有序树?为什么? 2个结点的树和二叉树的基本形态
B
D
H
(b)完全二叉树的顺序存储结构
《数据结构(Java版)(第4版)》第6章 19
2. 二叉树的链式存储结构
left A
左孩子 数据 右孩子 data right A
(1)二叉链表
B C E G H F
根指针 root B ∧ ∧ D ∧ G ∧
C ∧ E ∧ ∧ H ∧ F ∧
(2)三叉链表
D
left data right root parent B X ∧ ∧ D ∧ G ∧ (a)创建X结点作为parent的左孩子, parent的原左孩子D作为X结点的左孩子 ∧ D ∧ G ∧ ∧ H ∧ X ∧ A root B ∧ ∧ E ∧ left data right A C ∧ Y F ∧ parent
}
《数据结构(Java版)(第4版)》第6章 6
//查找 //包含 //删除子树
6.2 二叉树
6.2.1 二叉树定义 6.2.2 二叉树性质 6.2.3 二叉树的遍历 6.2.4 二叉树抽象数据类型 6.2.5 二叉树的存储结构 6.2.6 二叉树的二叉链表实现
《数据结构(Java版)(第4版)》第6章 7
}
//描述字符串 //判叶子结点
《数据结构(Java版)(第4版)》第6章 21
2. 二叉树类
public class BinaryTree<T>
{
BinaryNode<T> root;
//根结点
public BinaryTree() //构造空树 public boolean isEmpty() //判空 }
【实验题6-3】完全二叉树类
《数据结构(Java版)(第4版)》第6章 12
6.2.3 二叉树的遍历规则
1. 孩子优先的遍历规则 所有遍历序列有6种: ABC,BAC,BCA, //先左孩子 CBA,CAB,ACB。 //先右孩子 约定遍历子树的次序是先左子树后右子树
《数据结构(Java版)(第4版)》第6章 13
(b)静态三叉链表 《数据结构(Java版)(第4版)》第6章 20
6.2.6 二叉树的二叉链表实现
1.
{
二叉树的二叉链表结点类
public class BinaryNode<T>
T data;
//数据元素
BinaryNode<T> left, right; //左、右孩子
public BinaryNode(T data, BinaryNode<T> left, BinaryNode<T> right) //构造结点 public BinaryNode(T data) //构造叶子 public String toString() public boolean isLeaf()
6.1 树及其抽象数据类型 6.2 二叉树 6.3 线索二叉树 6.4 Huffman树 6.5 树的表示和实现 课程的重中之重,也是难点所在。 目的:理解树结构。 要求:掌握二叉树、树的表示和实现。 重点:二叉树实现,Huffman树,树。 难点:二叉链表存储结构,递归算法。
《数据结构(Java版)(第4版)》第6章 22
3. 二叉树插入结点
BinaryNode<T> insert(T x) //插入根结点 BinaryNode<T> insert(BinaryNode<T> parent, T x, boolean leftChild) //插入x为parent结点的左/右孩子
3. 二叉树的先根、 中根和后根次 序遍历算法
《数据结构(Java版)(第4版)》第6章 14
2. 兄弟优先的遍历规则
层次遍历序列: ABCDEFGH
《数据结构(Java版)(第4版)》第6章 15
习6-16(a)
给出二叉树的先根、中根、后根和层次遍历 序列。 A
B D I E J F K
《数据结构(Java版)(第4版)》第6章 16
(b)创建Y结点作为parent的右孩子, parent的原右孩子F作为Y结点的右孩子
《数据结构(Java版)(第4版)》第6章 23
4. 二叉树删除子树
//删除parent结点的左/右子树 public void remove(BinaryNode<T> parent, boolean leftChild)
//判空 //层次 //结点数 //高度 //先根次序遍历 //后根次序遍历 //层次遍历
《数据结构(Java版)(第4版)》第6章 5
ADT Tree<T>
TreeNode<T> insert(T x) //插入元素x作为根 TreeNode<T> insert(TreeNode<T> p, T x, int i) //插入x作为p结点的第i(≥0)个孩子 void remove(TreeNode<T> p, int i) //删除子树 void clear() //删除所有结点 TreeNode<T> search(T key) boolean contains(T key) T remove(T key)
《数据结构(Java版)(第4版)》第6章 3
6.1.2 树的术语
1. 父母、孩子与兄弟结点 4. 边、路径 2. 度 5. 无序树、有序树 3. 结点层次、树的高度 6. 森林
《数据结构(Java版)(第4版)》第6章 4
6.1.3 树抽象数据类型
ADT Tree<T> { boolean isEmpty() int level(T key) int size() int height() void preorder() void postorder() void levelorder() //树抽象数据类型
public void clear() //删除所有结点
《数据结构(Java版)(第4版)》第6章 24
5. 二叉树孩子优先的遍历算法
(1)先根次序遍历二叉树算法描述 public void preorder() //输出先根次序遍历序列 { preorder(this.root); //遍历以root结点为根的二叉树 } //先根次序遍历以p结点为根的子树,递归方法 private void preorder(BinaryNode<T> p) { if (p!=null) //若二叉树不空 { System.out.print(p.data.toString()+" "); //先访问 preorder(p.left); //遍历p的左子树,递归调用 preorder(p.right); //遍历p的右子树,递归调用 } }
}
《数据结构(Java版)(第4版)》第6章 18
6.2.5 二叉树的存储结构
1. 二叉树的顺序存储结构
二叉树的性质5 0 1 3 7 A C E 4 5 F 2 6 0 1 2 3 G 4 5 6 n- 1 (a)一棵完全二叉树 A B C D E F G H 2*i+1<n,左孩子 2*i+2<n,右孩子 i (i-1)/2,父母
《数据结构(Java版)(第4版)》第6章 25
(2)先根、中根、后根次序遍 历二叉树,递归算法
String toString() //先根次序遍历 String toString(BinaryNode<T> p)//递归 void inorder() //中根次序遍历序列 void inorder(BinaryNode<T> p) //递归 void postorder() //后根次序遍历序列 void postorder(BinaryNode<T> p) //递归