平衡二叉树
平衡二叉树是基于二叉搜索树的。由于二叉搜索树中,最坏可能出现O(n)的时间复杂度。所以平衡二叉树对二叉搜索树做了改进。增加了维护平衡机制
,让每一个节点的平衡因子绝对值都不会超过1。让平衡二叉树的查找、插入的时间复杂度都达到了O(logn)。
四种不平衡情况
维护平衡的详细机制,可以查看这篇文章:详细图文——AVL树。本文也参考自这篇文章。
LL
表示,插入当前节点的左子树的左子节点后,出现了不平衡。需要对当前节点进行右旋
。
private Node rightRotate(Node node){
Node left = node.left;
node.left=left.right;
left.right=node;
updateNodeHeight(node);
updateNodeHeight(left);
return left;
}
RR
表示,插入当前节点的右子树的右子节点后,出现了不平衡。需要对当前节点进行左旋
。
private Node leftRotate(Node node){
Node right=node.right;
node.right=right.left;
right.left=node;
updateNodeHeight(node);
updateNodeHeight(right);
return right;
}
LR
表示,插入当前节点的左子树的右子节点后,出现了不平衡。需要先对当前节点的左子树进行左旋
,再对当前节点进行右旋
。
node.left=leftRotate(node.left);
node=rightRotate(node);
RL
表示,插入当前节点的右子树的左子节点后,出现了不平衡。需要先对当前节点的右子树进行右旋
,再对当前节点进行左旋
。
node.right=rightRotate(node.right);
node=leftRotate(node);
维护平衡机制的核心部分
private Node toBalance(Node node){
//维护平衡
int balanceFactor=getBalanceFactor(node);
if(balanceFactor>1&&getBalanceFactor(node.left)>0){
//LL
node=rightRotate(node);
}else if(balanceFactor>1&&getBalanceFactor(node.left)<0){
//LR
node.left=leftRotate(node.left);
node=rightRotate(node);
}else if(balanceFactor<-1&&getBalanceFactor(node.right)>0){
//RL
node.right=rightRotate(node.right);
node=leftRotate(node);
}else if(balanceFactor<-1&&getBalanceFactor(node.right