平衡二叉树
平衡二叉搜索树(Self-balancing binary search tree
)又被称为AVL
树(有别于AVL
算法),且具有以下性质:
- 它是一 棵空树或它的左右两个子树的高度差的绝对值不超过
1
; - 左右两个子树都是一棵平衡二叉树。
是为了解决二叉查找树查找节点在最坏的情况下,该二叉树有可能退化成一个链表。
AVL
树除了满足二叉查找树的性质之外,AVL
树的特性如下:
AVL
树的左右子树的高度差别小于等于1
。AVL
树的左右子树也是AVL
树。
平衡因子:
定义:某结点的左子树与右子树的高度(深度)差即为该结点的平衡因子(BF,Balance Factor)。
平衡二叉树上所有结点的平衡因子只可能是-1
,0
或 1
。如果某一结点的平衡因子绝对值大于1
则说明此树不是平衡二叉树。为了方便计算每一结点的平衡因子我们可以为每个节点赋予height
这一属性,表示此节点的高度。
二叉树失衡的情况有LL
、RR
、LR
和RL
四种,调整二叉树为平衡二叉树的方法有2
种:右旋、左旋。
1、解决失衡
LL
(右旋):
/**
* 右旋转
*/
private Node rightRotate(Node y){
Node x = y.left;
Node t3 = x.right;
x.right = y;
y.left = t3;
//更新height
y.height = Math.max(getHeight(y.left),getHeight(y.right))+1;
x.height = Math.max(getHeight(x.left),getHeight(x.right))+1;
return x;
}
RR
左旋:
/**
* 左旋转
*/
private Node leftRotate(Node y){
Node x = y.right;
Node t2 = x.left;
x.left = y;
y.right = t2;
//更新height
y.height = Math.max(getHeight(y.left),getHeight(y.right))+1;
x.height = Math.max(getHeight(x.left)