平衡二叉树(AVL树)
1、为什么要平衡二叉树
如果由数组{1, 2, 3, 4, 5}来构建一颗二叉排序树,得到的二叉树不仅没有体现其特点,反而还退化成了链表,且因为要判断左子树,查询效率比链表还低
2、平衡二叉树的介绍
- 平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树,可以保证查询效率较高
- 具有以下特点:
- 它是一棵空树或它的左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都是一棵平衡二叉树
- 平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等
3、平衡二叉树的应用
3.1、左旋转
3.1.1、应用场景
右子树的高度高于左子树,且差值大于1,所以需要进行左旋转,来降低右子树的高度
3.1.2、思路分析
- 创建一个
newRoot
新节点,值为当前节点root
的值 - 让新节点的左子树
newRoot.left
指向当前节点root.left
的左子树 - 让新节点的右子树
newRoot.right
指向当前节点的右子树的左子树root.right.left
- 将当前节点的值
root.value
改为其右子树的值root.right.value
- 将当前节点的右子树变为其右子树的右子树
root.right = root.right.right
- 让当前节点的左子树指向新节点
root.left = newRoot
3.1.3、代码实现
注意:
在获取树的高度的时候,精髓在最后面的+1,只要left或者right有值,就将要返回的值+1,然后做递归
当左边的节点为null了,左边的递归就结束了,右边同理
//核心代码
public void leftRotate() {
Node newRoot = new Node(root.value);
newRoot.left = root.left;
newRoot.right = root.right.left;
root.value = root.right.value;
root.right = root.right.right;
root.left = newRoot;
}
//取当前节点树的高度
public int getHeight() {
//精髓在最后面的+1,只要left或者right有值,就将要返回的值+1,然后做递归
//当左边的节点为null了,左边的递归就结束了,右边同理
return Math.max(left == null ? 0 : left.getHeight(), right == null ? 0 : right.getHeight()) + 1;