java数据结构avl树_[Java教程][javaSE] 数据结构(AVL树基本概念)

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

0 2016-06-19 19:00:08

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,需要先左单旋转,再右单旋转

实现左单旋转

bc91bb04e6e9c61e24c974e4440db8f2.gif

k1,k2

k2的left给k1

k1的right给k2的left

k2给k1的right

实现右单旋转

k1,k2

k1的right给k2

k2的left给k1的right

k1给k2的left

bc91bb04e6e9c61e24c974e4440db8f2.gif

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

/** * AVL树测试 * @author taoshihan * @param * */public class AVLTree> { private AVLNode mRoot;//根节点 class AVLNode>{ 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 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 leftLeftRotation(AVLNode 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 rightRightRotation(AVLNode 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; }

本文网址:http://www.shaoqun.com/a/232614.html

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:admin@shaoqun.com。

JAVA

0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值