平衡二叉树——AVL树的旋转操作:Java语言实现

1 前言

       最近在研读《数据结构与算法经典问题解析》和《数据结构与算法分析 c语言描述》两本书,记录一下学习AVL树的笔记。

2 平衡二叉树——AVL树的旋转操作

2.1 AVL树的特点

 AVL树本质上还是一棵二叉搜索树,它的特点是:
1.本身首先是一棵二叉搜索树。
2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。

也就是说,AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树)。

2.2 AVL树的定义

package Binary_Tree_Study;

/**
 * Created by Administrator on 2018/5/20.
 */
public class AVLTreeNode {
    private int data;//结点的数据
    private int height;//树的高度
    private AVLTreeNode left;//指向左孩子结点
    private AVLTreeNode right;//指向左孩子结点

    public AVLTreeNode(int data) {
        this.data = data;
        this.height = 0;
        this.left = null;
        this.right =null;
    }

    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public AVLTreeNode getLeft() {
        return left;
    }

    public void setLeft(AVLTreeNode left) {
        this.left = left;
    }

    public AVLTreeNode getRight() {
        return right;
    }

    public void setRight(AVLTreeNode right) {
        this.right = right;
    }
}

2.3 AVL树的旋转操作

2.3.1 LL旋转

平衡二叉树——AVL树的旋转操作:Java语言实现_第1张图片


//LL旋转
public AVLTreeNode singleRotateLeft(AVLTreeNode x){
    AVLTreeNode w=  x.getLeft();
    x.setLeft(w.getRight());
    w.setRight(x);
    x.setHeight(Math.max(Height(x.getLeft()),Height(x.getRight()))+1);
    w.setHeight(Math.max(Height(w.getLeft()),x.getHeight())+1);
    return w;
}
//求树的高度
public int Height(AVLTreeNode root) {
    if (root == null)
        return -1;
    else
        return root.getHeight();
}

2.3.2 RR旋转

平衡二叉树——AVL树的旋转操作:Java语言实现_第2张图片

//RR旋转
public AVLTreeNode singleRotateRight(AVLTreeNode w){
    AVLTreeNode x=  w.getRight();
    w.setRight(x.getLeft());
    x.setLeft(w);
    w.setHeight(Math.max(Height(w.getRight()),Height(w.getLeft()))+1);
    x.setHeight(Math.max(Height(x.getRight()),w.getHeight())+1);
    return x;
}

2.3.3 LR旋转

平衡二叉树——AVL树的旋转操作:Java语言实现_第3张图片

//LR旋转
public AVLTreeNode doubleRotateLeft(AVLTreeNode z){
    z.setLeft(singleRotateRight(z.getLeft()));//在X和Y之间旋转
    return singleRotateLeft(z);//在Z和Y之间旋转
}

2.3.4 RL旋转

平衡二叉树——AVL树的旋转操作:Java语言实现_第4张图片

//RL旋转
public AVLTreeNode doubleRotateRight(AVLTreeNode x){
    x.setRight(singleRotateRight(x.getLeft()));//在Z和Y之间旋转
    return singleRotateRight(x);//在X和Y之间旋转
}

3 AVL 树的插入操作

//插入操作
    public AVLTreeNode insert(AVLTreeNode root, int data) {
        if (root == null)
            root = new AVLTreeNode(data);//若原树为空, 生成并返回一个结点的AVL树
        else if (data < root.getData()) {
                root.setLeft(insert(root.getLeft(),data));
                if (Height(root.getLeft())-Height(root.getRight()) == 2)
                    if (data < root.getLeft().getData())
                        root = singleRotateLeft(root);
                    else
                        root = doubleRotateLeft(root);
            } else if (data > root.getData()) {
                root.setRight(insert(root.getRight(),data));
                if (Height(root.getRight())-Height(root.getLeft()) == 2)
                    if (data < root.getRight().getData())
                        root = singleRotateRight(root);
                    else
                        root = doubleRotateRight(root);
        }
        /*否则,数据已经存在,程序什么也不做。*/
        root.setHeight(Math.max(Height(root.getLeft()),Height(root.getRight()))+1);
        return root;
    }

4 参考资料

[1] 数据结构与算法经典问题解析

[2] 数据结构与算法分析 c语言描述

[3] AVL树-----百度百科

后记:

       后续看了一些博文,感觉写得挺不错的,在此备注一下,以便以后查阅。

1. JAVA实践自平衡二叉树(AVL树)

2. java实现平衡二叉树(详细分析)

3. AVL树(三)之 Java的实现

4. AVL树Java实现,包括删除

5. 数据结构图文解析之:AVL树详解及C++模板实现

6. AVL树之java实现

7. 图解数据结构树之AVL树

8. 数据结构之AVL树

9. AVL平衡树(详解)-JAVA/C版本

10. java数据结构与算法之平衡二叉树(AVL树)的设计与实现

11. 彻底搞懂AVL树

12. 平衡二叉树(Balance Binary Tree) --AVL树

你可能感兴趣的:(数据结构与算法)