二叉搜索树
二叉搜索树(又叫二叉查找树、二叉排序树),具有以下特点:
- 节点的左孩子的值小于节点本身;
- 节点的右孩子的值大于节点本身;
- 左右子树同样为二叉搜索树;
所以二叉搜索树最终的特性为:
- 节点左子树的所有节点的值都小于节点本身;
- 节点右子树的所有节点的值都大于节点本身;
- 对二叉搜素树的一次中序遍历就是一个递增有序序列。
二叉平衡树(AVL)
二叉平衡树是在二叉搜素树的基础上加上了限制:任意节点,左右子树的高度差不能超过1。这个约束常常借助左旋和右旋操作实现。
- 二叉平衡树
- 不是二叉平衡树
性质:
-
它的左右子树都是AVL树
-
左右子树高度之差的绝对值不超过1
-
如果它有N个节点,其高度就可以保持在O(long2N),搜索的时间复杂度为O(long2N)。
平衡因子
平衡因子(bf):节点的右子树高度减去左子树高度。
结点的平衡因子 = 右子树的高度 - 左子树的高度
如果一棵二叉搜索树是高度平衡的(每个节点的平衡因子绝对值<=1),它就是 AVL 树。如果它有n个结点,其高度可保持在O(log2^n) ,
查找时间复杂度O(log2^n) 。
平衡二叉树的作用
二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。如下图所示:向一颗空的二叉查找树和AVL树中插入有序数列 {1,2,3,4,5,6}
由上图可知,在插入有序结点个数很多的情况下,会导致搜索二叉树的高度是O(N),查找时间复杂度O(n) ,
但是AVL树就不会出现这种情况,树的高度始终是O(log2 ^n) , 查找时间复杂度为O(log2 ^n) 。
平衡二叉树最大的作用就是查找,因为AVL树的查找、插入和删除在平均和最坏情况下都是O(logn)。但是如果在AVL树中插入或删除节点后,使得高度之差大于1。此时,AVL树的平衡状态就被破坏,它就不再是一棵二叉树;为了让它重新维持在一个平衡状态,就需要对其进行旋转处理。这时,就有左旋和右旋的概念。
左旋
对X节点左旋,即以X的右孩子Y为轴,将X节点转下来,变为Y的左孩子,简单记为左旋即把该节点变为左孩子。例如:
23被它的右子节点25取代,成为25的左子节点。如以下动图展示:
来源:左单旋
注意右孩子是必须存在的,即不能为空。
右旋
对X节点右旋,即以X的左孩子Y为轴,将X节点转下来,变为Y的右孩子,
简单记为右旋即把该节点变为右孩子。例如:
25被它的左子节点23取代,成为23的右子节点。如以下动图展示:
来源:右单旋
为什么要左旋右旋
在AVL平衡二叉树中,当插入或删除节点后,可能导致树的不平衡,需要进行旋转操作来恢复平衡。左旋和右旋是两种常见的旋转操作。