如果出现了一个
1-2-3-4-5-6-7 这样的一个二叉树,在插入的时候,速度没有影响
但是在查找的时候,比单链表还要慢。因为他要判断左子树。
所以引出了平衡二叉树
什么是平衡二叉树
左右子树的高度绝对值不能超过1。
也就是和原来的二叉树,基本方法一致,只是将有些点的位置移动。
左旋转,也就是将右边的节点移动往上移动。右边的弄到左边来
public void rightRotate(){
AvlNode newNode = new AvlNode(value);
newNode.right = right;
newNode.left = left.right;
value = left.value;
left = left.left;
right = newNode;
}
public void leftRotate(){
AvlNode newNode = new AvlNode(value);
newNode.left = left;
newNode.right = right.left;
value = right.value;
right = right.right;
left = newNode;
}
我们需要的是在添加的时候做处理
if (rightHeight() - leftHeight() > 1) {
leftRotate();
}
if (leftHeight() - rightHeight() > 1) {
rightRotate();
}
以上只是简单的处理了平衡,没有考虑到特殊情况。
因为在移动的过程中,还可能出现另一种情况,会让坐旋转或者右旋转出现无任何效果
if (rightHeight() - leftHeight() > 1) {
if (right != null && right.leftHeight() > right.rightHeight()) {
right.rightRotate();
leftRotate();
}else {
leftRotate();
}
}
if (leftHeight() - rightHeight() > 1) {
if (left != null && left.leftHeight() < left.rightHeight()) {
left.leftRotate();
rightRotate();
}else {
rightRotate();
}
}
所以在旋转之前还要旋转一次。