这一章主要讲解了与树相关的知识。主要分析了二叉树、二叉搜素树,AVL 树,伸展树,在此我补充了满二叉数,完全二叉树。
一、二叉树
二叉树是有限个结点的集合,这个集合或者是空集,或者是由一个根结点和两株互不相交的二叉树组成,其中一株叫根的做左子树,另一棵叫做根的右子树。
二叉树的性质:
- 性质1:在二叉树中第 i 层的结点数最多为2^(i-1)(i ≥ 1)
- 性质2:高度为k的二叉树其结点总数最多为2^k-1( k ≥ 1)
- 性质3:对任意的非空二叉树 T ,如果叶结点的个数为 n0,而其度为 2 的结点数为 n2,则:n0 = n2 + 1
二、二叉搜索树
二叉搜索树是学习二叉树之后,接触的第一个实用数据结构。特点是,左子树全部小于根,右子树全部大于根,元素不重复。一般能够支持对数级别的增删改查操作,但在二叉树发生倾斜的情况下,效率会下降至线性。
二叉搜索树的插入、删除、查找、遍历(递归、非递归)的实现见我的文章:
三、AVL 树
AVL树是一种高度平衡的二叉搜索树,其命名源自于联合发明算法的三位科学家的名字的首字母。
此处“平衡”的定义是:任意节点的左右子树的高度相差不超过1。
有了这个平衡的性质,使得AVL树的高度H总是接近log(N),因此各种增删改查的操作的复杂度能够保证在对数级别。没有bad case是AVL树与普通的二叉搜索树的最大区别。为了实现平衡性质,我们需要记录每个节点的高度(或者平衡因子)来检测不平衡的情况。为了修正高度不平衡,需要用到“旋转”的方法,分为单旋转和双旋转,左右总共四种旋转。下面的图解会给出旋转的示意,这个是AVL树的关键算法。AVL树看起来特简单,但你动手写写就知实现一棵AVL树有多麻烦。
四、满二叉树
满二叉树:深度为k且有2^k -1个结点的二叉树称为满二叉树
五、完全二叉树
完全二叉树:深度为 k 的,有n个结点的二叉树,当且仅当其每个结点都与深度为 k 的满二叉树中编号从 1 至 n 的结点一一对应,称之为完全二叉树。(除最后一层外,每一层上的节点数均达到最大值;在最后一层上只缺少右边的若干结点)
- 性质4:具有 n 个结点的完全二叉树的深度为 log2n + 1
注意:
仅有前序和后序遍历,不能确定一个二叉树,必须有中序遍历的结果