平衡二叉树——AVL树的旋转操作:Java语言实现(这篇有误, 后续会重写订正,不要再学习这篇了!!!)

本文介绍了AVL树的基本概念,特点和旋转操作,包括LL、RR、LR和RL四种旋转类型。通过Java语言阐述了AVL树的平衡因子和插入操作,提供了多个参考资料链接供进一步学习。
摘要由CSDN通过智能技术生成

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旋转


//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旋转

//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旋转

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

2.3.4 RL旋转

//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树

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值