平衡二叉树 -单旋转

平衡二叉树 -单旋转

右旋转

当左子树的高度减去右子树的高度的结果大于1时进行右旋转

即针对于左左型(LLR,LLL)

具体步骤

1.创建一个新的结点,结点的值为不平衡结点的值

2.新节点的右孩子为不平衡结点的右孩子结点

3.新节点的左孩子为不平衡结点左孩子结点的右孩子结点

4.不平衡结点的值改为其左孩子结点的值

5.不平衡结点的左孩子修改为其左孩子结点的左孩子结点

6.不平衡结点的右孩子修改为新结点

实现代码

    /**
     * 右旋转
     * 如果左子树高度-右子树高度大于1进行右旋转
     */
    public void rightRotate(){

        //创建新的结点新结点的值为当前结点的值
        BinarySortNode newNode = new BinarySortNode(this.value);
        //新建结点的右孩子结点为当前结点的右孩子结点
        newNode.setRight(this.getRight());
        //新建结点的左孩子结点为当前结点的左孩子结点的右孩子结点
        newNode.setLeft(this.getLeft().getRight());
        //当前结点的右孩子结点为新建结点
        this.setRight(newNode);
        //当前结点的值为当前结点的左孩子结点的值
        this.setValue(this.getLeft().getValue());
        //当前结点的左孩子结点为当前结点的左孩子结点的左孩子结点
        this.setLeft(this.getLeft().getLeft());
      

    }

左旋转

当右子树的高度减去左子树的高度的结果大于1时进行右旋转

即针对于右右型(RRR,RRL)

具体步骤

1.创建一个新的结点,结点的值为不平衡结点的值

2.新节点的左孩子为不平衡结点的左孩子结点

3.新节点的右孩子为不平衡结点右孩子结点的左孩子结点

4.不平衡结点的值改为其右孩子结点的值

5.不平衡结点的右孩子修改为其右孩子结点的右孩子结点

6.不平衡结点的左孩子修改为新结点

实现代码


    /**
     * 左旋转
     * 如果右子树高度-左子树高度的值大于1进行左旋转
     */
    public void leftRotate(){

        //创建新的结点新结点的值为当前结点的值
        BinarySortNode newNode = new BinarySortNode(this.value);
        //新结点的左孩子结点为当前结点的左孩子结点
        newNode.setLeft(this.getLeft());
        //新结点的右孩子结点为当前节点的右孩子结点的左孩子结点
        newNode.setRight(this.getRight().getLeft());
        //当前结点的左孩子结点为新建结点
        this.setLeft(newNode);
        //当前结点的值为当前结点右孩子结点的值
        this.setValue(this.getRight().getValue());
        //当前结点的右孩子结点为当前结点的右孩子结点的右孩子结点
        this.setRight(this.getRight().getRight());
        

    }
原文地址:https://www.cnblogs.com/huangshen/p/13394012.html