目录
一.树形结构
二.基本概念
三.二叉树种类及性质
1.满二叉树
2.完全二叉树
3.完满二叉树
4.平衡二叉树
5.二叉树的性质
6.性质相关习题
四.二叉树的存储方式
五. 二叉树的遍历方式
六.二叉树的定义
一.树形结构
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合
它具有以下的特点:
- 有一个特殊的结点,称为根结点,根结点没有前驱结点
- 除根结点外,其余结点被分成M(M > 0)个互不相交的集合T1、T2、......、Tm,其中每一个集合Ti (1 又是一棵与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继
- 树是递归定义的。
注意:
- 树形结构中,子树之间不能有交集,否则就不是树形结构
- 一棵N个结点的树有N-1条边。
二.基本概念
- 根节点:位于二叉树顶层的节点,没有父节点。
- 叶节点:没有子节点的节点,其两个指针均指向
None
。- 边:连接两个节点的线段,即节点引用(指针)。
- 节点所在的层:从顶至底递增,根节点所在层为 1 。
- 节点的度:节点的子节点的数量。在二叉树中,度的取值范围是 0、1、2 。
- 二叉树的高度/深度:从根节点到最远叶节点所经过的边的数量。
- 节点的深度:从根节点到该节点所经过的边的数量。
- 节点的高度:从距离该节点最远的叶节点到该节点所经过的边的数量。
有些题目或教材可能会将其定义为“经过的节点的数量”。在这种情况下,高度和深度都需要加 1 。- 以上重点记忆
- 非终端结点或分支结点:度不为0的结点; 如上图:D、E、F、G...等节点为分支结点
- 兄弟结点:具有相同父结点的结点互称为兄弟结点; 如上图:B、C是兄弟结点
- 堂兄弟结点:双亲在同一层的结点互为堂兄弟;如上图:H、I互为兄弟结点
- 结点的祖先:从根到该结点所经分支上的所有结点;如上图:A是所有结点的祖先
- 子孙:以某结点为根的子树中任一结点都称为该结点的子孙。如上图:所有结点都是A的子孙 森林:由m(m>=0)棵互不相交的树组成的集合称为森林
三.二叉树种类及性质
1.满二叉树
满二叉树: 一棵二叉树,如果每层的结点数都达到最大值,则这棵二叉树就是满二叉树。也就是说,如果一棵 二叉树的层数为K,且结点总数是2^k - 1 ,则它就是满二叉树。
2.完全二叉树
完全二叉树: 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n 个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从0至n-1的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。
3.完满二叉树
完满二叉树:除了叶节点之外,其余所有节点都有两个子节点。
4.平衡二叉树
平衡二叉树:中任意节点的左子树和右子树的高度之差的绝对值不超过 1 。
5.二叉树的性质
- 若规定根结点的层数为1,则一棵非空二叉树的第i层上最多有2^i-1 (i>0)个结点
- 若规定只有根结点的二叉树的深度为1,则深度为K的二叉树的最大结点数是 (k>=0)
- 对任何一棵二叉树, 如果其叶结点个数为 n0, 度为2的非叶结点个数为 n2,
则有n0=n2+1- 具有n个结点的完全二叉树的深度k为 log2(n+1) 上取整
- 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的顺序对所有节点从0开始编号,则对于序号为i 的结点有:
若i>0,双亲序号:(i-1)/2;i=0,i为根结点编号,无双亲结点
若2i+1<n,左孩子序号:2i+1,否则无左孩子
若2i+2<n,右孩子序号:2i+2,否则无右孩子- 在完全二叉树中,如果节点总个数为奇数,则没有度为1的节点;如果节点总个数为偶数,只有一个度为1的节点。
6.性质相关习题
题目:某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为?
题解:由二叉树的性质,如果其叶结点个数为 n0, 度为2的非叶结点个数为 n2,则有n0=n2+1,所以n0 = 199 +1 = 200.
题目:在具有 2n 个结点的完全二叉树中,叶子结点个数为( )
题解:
2n为偶数,因此有一个度为1的节点。
2n = n0 + 1 + n2 = n0 + 1 + n0 - 1
2n = 2n0
n0 = n
题目:一个具有767个节点的完全二叉树,其叶子节点个数为()
767为奇数没有度为1的节点,767 = n0 + n1 + n2 767 = n0 + 0 + n2
题解:由n0 = n2 + 1推出n2 = n0 - 1 767 = n0 + 0 + n0 -1 -> 767 = 2n0 - 1
所以:n0 = 768 / 2 = 384
题目:一棵完全二叉树的节点数为531个,那么这棵树的高度为( )
题解:已知节点求高度,运用性质4,h = log(n+1)向上取证。h = log(531+1),向上取整为10
题目:将一颗有 100 个结点的完全二叉树从根这一层开始,每一层从左到右依次对结点进行编号,根节点编号为 1 ,则编号为 98 的节点的父节点编号为()
因为根节点编号从1开始且为完全二叉树,根据性质若2i<n,左孩子序号:2i
所以父节点为98/2 = 49
题目: 一颗拥有1000个结点的树,树的度(即一个节点的最大子节点数)为4,则它的最小深度是( )
当这棵树每一层都是满的时,它的深度最小。也就是说,这棵树应当是一棵满四叉树。
高度为h,则这个树的节点个数为(4^h - 1) / 3,当h = 5, 最大节点数为341, 当h = 6, 最大节点数为1365,所以最小深度应该为6。
题目:在一颗度为3的树中,度为3的结点有2个,度为2的结点有1个,度为1的结点有2个,则叶子结点有( )个。
题解:令n3 = 2;n2 = 1;n1 = 2;设总结点的个数为N
则由节点个数的关系得 N = n3 + n2 + n1 + n0,由边条数的关系得 N-1 = 3*n3 + 2*n2 + 1*n1 + 0*n0
联立可得:N = 2 + 1 + 2 + n0,N-1 = 3*2 + 2*1 + 1*2 + 0
n0 = 6
四.二叉树的存储方式
二叉树可以链式存储,也可以顺序存储。
链式存储方式就用指针, 顺序存储的方式就是用数组。
链式(指针指向):
顺序(数组):
用数组来存储二叉树如何遍历的呢?
如果父节点的数组下标是 i,那么它的左孩子就是 i * 2 + 1,右孩子就是 i * 2 + 2。
五. 二叉树的遍历方式
二叉树主要有两种遍历方式:
- 深度优先遍历:先往深走,遇到叶子节点再往回走。
- 广度优先遍历:一层一层的去遍历。
- 深度优先遍历
- 前序遍历(递归法,迭代法) 遵循根左右的顺序
- 中序遍历(递归法,迭代法) 遵循左根右的顺序
- 后序遍历(递归法,迭代法) 遵循左右根的顺序
- 广度优先遍历
- 层序遍历(迭代法) 从上到下从左到右遍历
六.二叉树的定义
class TreeNode {
public char val;
public TreeNode left;
public TreeNode right;
public TreeNode(char val) {
this.val = val;
}
}
public TreeNode createTree (){
TreeNode A = new TreeNode('A');
TreeNode B = new TreeNode('B');
TreeNode C = new TreeNode('C');
TreeNode D = new TreeNode('D');
TreeNode E = new TreeNode('E');
TreeNode F = new TreeNode('F');
TreeNode G = new TreeNode('G');
TreeNode H = new TreeNode('H');
A.left = B;
A.right = C;
B.left = D;
B.right = E;
C.left = F;
C.right = G;
E.right = H;
return A;
}