平衡二叉树由Adelson-Velskii和Landis在1962年提出,因此也成为AVL树。它是一棵空树或者是具有以下性质的二叉排序树:
(1)根结点的左子树和右子树的深度最多相差1。
(2)根结点的左子树和右子树也是二叉平衡树。
平衡因子: 节点的平衡因子是该节点的左子树和右子树的深度之差。
最小不平衡子树: 最小不平衡子树是指平衡二叉树的构造过程中,以距离插入点最近的,而平衡因子的绝对值大于1的节点为根节点的子树。
出现不平衡的情况主要有4种: RR型,RL型,LL型,LR型。(PS: 比起插入,它的删除更有刺激哦)
由于算法难度比较大,小编未能实现出来,所以提供不了源代码。其实我们不难看出,AVL树有着极高的平衡要求,即左右子树高度相差最多不能超过1,当我输出一串连续递增或递减的数字时,需要不断地调整才能保持它的平衡。由于它的高度平衡性,在插入或删除算法中,对树的旋转次数较多,所以在C++或Java等编程语言中难以广泛使用。由此我们引入了另一种算法,红黑树算法。红黑树具有以下几个特征:
(1)节点只能为红色或黑色。
(2)根节点只能为黑色。
(3)每个叶子节点(空节点)都为黑色。
(4)如果一个节点为红色,那么它的两个节点为黑色。
(5)从每个节点,从该节点到其子孙节点的所有路径上包含的相同数目的黑节点。
很明显,红黑树的平衡条件没有AVL树那么严格,因此减少插入或删除时调整的次数,每个节点的最大高度之差不超过2倍,因此它比AVL树有着更大范围地使用。由于红黑树算法也有着比较大的难度,小编也未能实现出来,所以也提供不了源代码。(红黑树的插入主要有5类型,有兴趣可以百度下)
下面附上Java的最高境界: