前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[javaSE] 数据结构(AVL树基本概念)

[javaSE] 数据结构(AVL树基本概念)

作者头像
唯一Chat
发布2019-09-10 16:17:44
3170
发布2019-09-10 16:17:44
举报
文章被收录于专栏:陶士涵的菜地陶士涵的菜地

AVL树是高度平衡的二叉树,任何节点的两个子树的高度差别<=1

实现AVL树

定义一个AVL树,AVLTree,定义AVLTree的节点内部类AVLNode,节点包含以下特性:

1.key——关键字,对AVL树的节点进行排序

2.left——左子树

3.right——右子树

4.height——高度

如果在AVL树插入节点后可能导致AVL树失去平衡,具体会有四种状态:

LL:左左,LeftLeft

LR:左右,LeftRight

RL:右左,RightLeft

RR:右右,RightRight

解决上面的情况

解决LL,需要左单旋转

解决RR,需要右单旋转

解决LR,需要先右单旋转,再左单旋转

解决RL,需要先左单旋转,再右单旋转

实现左单旋转

k1,k2

k2的left给k1

k1的right给k2的left

k2给k1的right

实现右单旋转

k1,k2

k1的right给k2

k2的left给k1的right

k1给k2的left

节点的高度,是它左子树或者右子树中,高度大的那个 再加1

代码语言:javascript
复制
/**
 * AVL树测试
 * @author taoshihan
 * @param <T>
 *
 */
public class AVLTree<T extends Comparable<T>> {
    private AVLNode mRoot;//根节点
    class AVLNode<T extends Comparable<T>>{
        private T key;//键值
        private int height;//高度
        private AVLNode left;//左子树
        private AVLNode right;//右子树
        public AVLNode(T key,AVLNode left,AVLNode right) {
            this.key=key;
            this.left=left;
            this.right=right;
            this.height=0;
        }
    }
    /**
     * 获取节点高度
     * @param tree
     * @return
     */
    public int height(AVLNode<T> tree){
        if(tree!=null){
            return tree.height;
        }
        return 0;
    }
    /**
     * 取出左右子树中高的那个
     * @param a
     * @param b
     * @return
     */
    public int maxHeight(int a,int b){
        return a>b ? a : b;
    }
    /**
     * 左单旋转
     * @param k2
     * @return
     */
    public AVLNode<T> leftLeftRotation(AVLNode<T> k2){
        AVLNode k1;
        k1 = k2.left;
        k2.left=k1.right;
        k1.right=k2;
        k2.height=maxHeight(height(k2.left), height(k2.right));
        k1.height=maxHeight(height(k1.left), height(k1.right));
        return k1;
    }
    /**
     * 右单旋转
     * @param k2
     * @return
     */
    public AVLNode<T> rightRightRotation(AVLNode<T> k1){
        AVLNode k2;
        k2=k1.right;
        k1.right=k2.left;
        k2.left=k1;
        
        k2.height=maxHeight(height(k2.left), height(k2.right));
        k1.height=maxHeight(height(k1.left), height(k1.right));
        return k2;
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-06-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档