文章目录
- 一、什么是二叉树?
- 二、二叉树的特点
- 三、二叉树的性质
- 四、两种特殊的二叉树
- 4.1、满二叉树
- 4.2、完全二叉树
- 五、一些关于二叉树特性的习题
- 六、二叉树的存储[代码实现]
- 6.1、链式存储
- 6.2、顺序存储
- 七、二叉树的遍历
- 7.1、关于二叉树遍历的选择题练习
一、什么是二叉树?
二叉树是特殊的树。一棵二叉树是结点的有限集合:(1)、结点或者为空。(2)、或者由一个根结点加上两颗别称为左子树和右子树的二叉树组成。
二、二叉树的特点
(1)、二叉树的每个结点的度不能超过2(<=2)。
(2)、二叉树要求其每颗子树都必须为二叉树。
(3)、二叉树的子树有左右之分,左子树、右子树不能次序颠倒,二叉树是一颗有序树。
三、二叉树的性质
(1)、若规定根结点层数为1,则一颗非空二叉树的第i层上最多有 2^(i - 1) (i > 0)个结点。(即根据公式 2 ^ (i - 1) 就可以求出二叉树每层所含的结点个数)
推导过程:
(2)、若规定只有根结点的二叉树的深度为1,则深度为k的二叉树所含的总结点个数为 2^k - 1(k >= 0)。
推导过程:
(3)、对任何一颗二叉树,如果其叶结点个数为 n0,度为2的非叶子结点个数为n2,则 n0 = n2 + 1。
推导过程:
(4)、具有n个结点的完全二叉树的深度k为log以2为底的(n+1)。
推导过程:
(5)、对于具有n个结点的完全二叉树,如果按照从上至下、从左至右的顺序对所有结点从0开始编号,则对于序号为i的结点有:
四、两种特殊的二叉树
4.1、满二叉树
满二叉树:一棵二叉树,如果每层的结点树都达到最大值2,则这颗二叉树就是满二叉树。也就是说,一棵二叉树的层数为k,那么这颗二叉树的总结点数为 (2^k)- 1,则他就是满二叉树。
4.2、完全二叉树
完全二叉树是效率很高的数据结构,是由满二叉树引出来的。对于深度为k,有n个节点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从0至n-1的结点— —对应时称之为完全二叉树。满二叉树是一种特殊的完全二叉树。
五、一些关于二叉树特性的习题
(1)、若一颗二叉树的结点数为399,度为2的非叶子结点n2有199个,叶子结点n0为()个。
A、100
B、200
C、300
D、120
由于公式 n0 = n2 + 1,因此 选B。
(2)、在2n个结点的完全二叉树中,叶子结点的个数为()。
A、n
B、n+1
C、n-1
D、n/2
(3)、一个具有 767 个结点的完全二叉树,其叶子结点个数为()。
A、383
B、384
C、385
D、386
(4)、一颗完全二叉树的结点数为 531 个,那么这棵树的高度为(B)。
A、11
B、10
C、8
D、12
六、二叉树的存储[代码实现]
二叉树的存储结构分为:线性存储和类似于链表的链式存储。
6.1、链式存储
二叉树的链式存储是通过一个一个的结点引用起来的,常见的表示方法有二叉和三叉表示方式, 具体如下:
// 孩子表示法
class Node {
int val; // 结点的值
Node left;// 左孩子的引用,常常代表左孩子为根的整颗左子树
Node right;// 右孩子的引用,常常代表右孩子为根的整颗右子树
}
// 孩子双亲表示法
class Node {
int val; // 数据域
Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树
Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
Node parent; // 当前节点的根节点
}
采用 孩子表示法 构造 二叉树
前序遍历preOrder()的代码解析:
获取结点数size()的代码解析:
6.2、顺序存储
七、二叉树的遍历
二叉树 最重要的 基本功能 就是遍历,二叉树的遍历方式具有4种。
所谓 遍历(Traversal) 是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。
访问结点所做的操作依赖于具体的应用问题 (比如:打印节点内容、节点内容加1)。 遍历是二叉树上最重要的操作之一,是二叉树上进行其它运算的基础。遍历的方式有4种:
(1)、前序遍历
根 ——> 左子树 ——> 右子树
(2)、中序遍历
左子树 ——> 根 ——> 右子树
(3)、后序遍历
左子树——> 右子树 ——> 根
(4)、层序遍历
从左到右,遍历每一层。
根据前序 和 后序 能不能创建一颗二叉树。不能。为什么不能?
7.1、关于二叉树遍历的选择题练习
(1)、某完全二叉树按层次输出(同一层从左到右)的序列为 ABCDEFGH 。该完全二叉树的前序序列为()
A: ABDHECFG
B: ABCDEFGH
C: HDBEAFCG
D: HDEBFGCA
(2)、二叉树的先序遍历和中序遍历如下:先序遍历:EFHIGJK;中序遍历:HFIEJKG.则二叉树根结点为()
A: E
B: F
C: G
D: H
(3)、设一课二叉树的中序遍历序列:badce,后序遍历序列:bdeca,则二叉树前序遍历序列为()
A: adbce
B: decab
C: debac
D: abcde
[!] 根据前序遍历、后序遍历 能否创建出一颗二叉树? 不能! 前序 和 后序 都只能确定根,不能确定根的左右子树!
(4)、某二叉树的后序遍历序列与中序遍历序列相同,均为 ABCDEF ,则按层次输出(同一层从左到右)的序列为()
A: FEDCBA
B: CBAFED
C: DEFCBA
D: ABCDEF