一、平衡二叉树
要求左子树的高度与右子树的高度只差不超过1。
二、实现
1.左旋
如果rightHeight() - leftHeight() > 1,则左旋转
(1)新创建一个节点,新节点的值为当前根节点的值;
(2)让新节点的左结点指向当前结点的左节点;
(3)让新节点的有节点指向当前节点有节点的左节点;
(4)把当前节点的值换为右子结点的值;
(5)最后把当前结点的左子结点设置为新结点。
代码如下(示例):
//左旋转 rightHeight() - leftHeight() > 1
public void leftRotate(){
//创建一个新的结点 newNode(以根节点的值进行创建)
AVLNode newNode = new AVLNode(no);
// 把新节点的左子树设置为当前节点的左子树
newNode.left = left;
//把新节点的右子树设置为当前节点的右子树的左子树
newNode.right = right.left;
//把当前节点的值换为右子节点的值
no = right.no;
//把当前节点的右子树设置成右子树的右子树
right = right.right;
//把当前节点的左子树设置为新节点
left = newNode;
}
2.右旋
代码如下(示例):
//右旋转 leftHeight() - rightHeight() > 1
public void rightRotate(){
// 创建一个新的节点
AVLNode newNode = new AVLNode(no);
//把新节点的右子树设置成当前节点的右子树
newNode.right = right;
//把新节点的左子树设置成当前节点的左子树的右子树
newNode.left = left.right;
//把当前节点的值换为左子树的值
no = left.no;
//把当前节点的左子树设置成左子树的左子树
left = left.left;
//把当前节点的右子树设置为新节点
right = newNode;
}
3.双旋
代码如下(示例):
//双旋转
public void rotate(){
if(rightHeight() - leftHeight() > 1){
if(right != null && right.leftHeight() > right.rightHeight()){
right.rightRotate();
leftRotate();
}else {
leftRotate();
}
return;
}
if(leftHeight() - rightHeight() > 1){
if(left != null && left.rightHeight() > left.leftHeight()){
left.leftRotate();;
rightRotate();
}else {
rightRotate();
}
return;
}
}