package com.rao.linkList;

/**
* @author Srao
* @className AvlTree
* @date 2019/12/3 21:23
* @package com.rao.linkList
* @Description 二叉平衡树
*/ /**
* 定义Avl树的节点
*/
class AvlNode{
int data;
AvlNode lchild;//左孩子
AvlNode rchild;//右孩子
int height;//当前节点所在的高度
} /**
* 定义平衡二叉树
*/
public class AvlTree { /**
*
* @param avlNode
* @return 返回当前节点所在的高度
*/
public int height(AvlNode avlNode){
if (avlNode == null){
return -1;
}else {
return avlNode.height;
}
} /**
* 左左型,进行右旋操作
* @param K2:非平衡二叉树的根节点,以这个点进行旋转
* @return
*/
public AvlNode R_Rotate(AvlNode k2){
AvlNode k1; //进行旋转
k1 = k2.lchild;
k2.lchild = k1.rchild;
k1.rchild = k2; //重新计算高度,只有一个节点时的高度为0
//原先根节点的高度
k2.height = Math.max(height(k2.lchild), height(k2.rchild)) + 1;
//新根节点的高度
k1.height = Math.max(height(k1.rchild), height(k1.rchild)) + 1; //返回新的根节点
return k1;
} /**
* 右右型,进行左旋操作
* @param k2
* @return
*/
public AvlNode L_Rotate(AvlNode k2){
AvlNode k1; //进行旋转
k1 = k2.rchild;
k2.rchild = k1.lchild;
k1.lchild = k2; //重新计算高度
//原先根节点的高度
k2.height = Math.max(height(k2.lchild), height(k2.rchild)) + 1;
//新根节点的高度
k1.height = Math.max(height(k1.rchild), height(k1.rchild)) + 1; //返回新的根节点
return k1;
} /**
* 左右型,先进行左旋,再进行右旋
* @param k3 非平衡树的根节点
* @return
*/
public AvlNode L_R_Rotate(AvlNode k3){
//先对其左孩子进行左旋
k3.lchild = L_Rotate(k3.lchild); //再进行整体右旋
return R_Rotate(k3);
} /**
* 右左型,先进行右旋,再进行左旋
* @param k3
* @return
*/
public AvlNode R_L_Rotate(AvlNode k3){
//先对其右孩子进行右旋
k3.rchild = R_Rotate(k3.rchild); //再整体左旋
return L_Rotate(k3);
} /**
* 向平衡二叉树中插入一个数
* @param data:要插入的数
* @param t:二叉树的根节点
* @return 返回新的二叉树
*/
public AvlNode insert(int data, AvlNode t){
//如果二叉树已经没有根节点,那么这个数就成了一个新的二叉树
if (t == null){
t = new AvlNode();
t.data = data;
t.lchild = null;
t.rchild = null;
}else if (data < t.data){
//向左孩子递归插入
t.lchild = insert(data, t.lchild); //进行调整,如果左孩子的高度比右孩子的高度大2
if (height(t.lchild) - height(t.rchild) == 2){
//左左型,右旋
if (data < t.lchild.data){
t = R_Rotate(t);
}else {//左右型,先左旋,再右旋
t = L_R_Rotate(t);
}
}
}else if (t.data < data){
//向右递归插入
t.rchild = insert(data, t.rchild); //进行调整,如果右孩子的高度比左孩子的高度大2
if (height(t.rchild) - height(t.lchild) == 2){
//右右型,左旋
if (data > t.rchild.data){
t = L_Rotate(t);
}else {
//右左型,先右旋,再左旋
t = R_L_Rotate(t);
}
}
} //重新计算树的高度
t.height = Math.max(height(t.lchild), height(t.rchild)) + 1;
return t;
} }

只要记住每次旋转时都是从根节点开始旋转,理解起来还不算太难

平衡二叉树(Java)的更多相关文章

  1. 平衡二叉树 JAVA实现 亲测可用

    平衡二叉树的JAVA实现 亲测可用 包括LL LR RL RR四种情况的旋转算法 以及添加删除树结点之后对平衡二叉树的维护算法 都已经实现并测试过 没有问题. 代码地址可以直接上我的GIT clone ...

  2. 数据结构-平衡二叉树Java实现

    1,Node.java package com.cnblogs.mufasa.BalanceBinaryTree; public class Node { Node parent; Node left ...

  3. leetcode-110:判断平衡二叉树 Java

    Balanced Binary Tree Given a binary tree, determine if it is height-balanced. For this problem, a he ...

  4. 平衡二叉树--java

    package com.test.tree; /** * 带有平衡条件的二叉查找树 * */ public class AVLBinarySearchTree<T extends Compara ...

  5. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  6. Java实现平衡二叉树(AVLTree)的构建

    近期在学习数据结构上关于平衡二叉树的知识,看了严老师的思路,感觉用java写出递归的构建方式有点困难,由于当中的递归须要把引用传进去,所以感觉是要实现起来比較麻烦,所以就首先想到使用非递归的方式来实现 ...

  7. 平衡二叉树(AVL)java实现

    数的节点 package com.ydp.tree.AVLTree; public class Node{ private int data = 0; private Node lchild = nu ...

  8. 平衡二叉树的java实现

    转载请注明出处! 一.概念 平衡二叉树是一种特殊的二叉搜索树,关于二叉搜索树,请查看上一篇博客二叉搜索树的java实现,那它有什么特别的地方呢,了解二叉搜索树的基本都清楚,在按顺序向插入二叉搜索树中插 ...

  9. 【Java】 剑指offer(55-2) 平衡二叉树

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一棵二叉树的根结点,判断该树是不是平衡二叉树.如果某二叉树 ...

  10. 【Java】 大话数据结构(12) 查找算法(3) (平衡二叉树(AVL树))

    本文根据<大话数据结构>一书及网络资料,实现了Java版的平衡二叉树(AVL树). 平衡二叉树介绍 在上篇博客中所实现的二叉排序树(二叉搜索树),其查找性能取决于二叉排序树的形状,当二叉排 ...

随机推荐

  1. MySql Packet for query is too large问题解决方案

    MySQL会限制Server接受的数据包大小.有时候插入.更新或查询时数据包的大小,会受 max_allowed_packet 参数限制,导致操作失败.报错信息为: Caused by: com.my ...

  2. springmvc接收参数为日期类型

    用单个Date类型接收日期类型时,会出现报错,加上initBinder的方法 意思是将所有传入的参数都通过此方法,如果过是日期通过日期格式化器进行格式化 如果是接收类型为对象内的属性为Date类型时 ...

  3. Scala2.12 从入门到精通实战高端视频课程(含网盘下载地址)

    Scala快速入门到精通 下载地址链接:https://pan.baidu.com/s/1bTSZSlWftFYaLQL6lVH62A 提取码:ohfk 下载后使用视频中自带的专用播放器打开视频就能看 ...

  4. PowerBuilder学习笔记之14用户自定义对象

    教程链接:https://wenku.baidu.com/view/9730d1c7aa00b52acec7ca05.html?re=view&rec_flag=default&sxt ...

  5. HDU校赛 | 2019 Multi-University Training Contest 3

    2019 Multi-University Training Contest 3 http://acm.hdu.edu.cn/contests/contest_show.php?cid=850 100 ...

  6. Java四种权限修饰符 在创建类中的使用

    四种权限修饰符 Java中有四种权限修饰符 public > protected > (default) >private 同一个类(我自己) YES YES YES YES同一个包 ...

  7. 示例:WPF中Slider控件封装的缓冲播放进度条控件

    原文:示例:WPF中Slider控件封装的缓冲播放进度条控件 一.目的:模仿播放器播放进度条,支持缓冲任务功能 二.进度: 实现类似播放器中带缓存的播放样式(播放区域.缓冲区域.全部区域等样式) 实现 ...

  8. C#读写设置修改调整UVC摄像头画面-光圈

    有时,我们需要在C#代码中对摄像头的光圈进行读和写,并立即生效.如何实现呢? 建立基于SharpCamera的项目 首先,请根据之前的一篇博文 点击这里 中的说明,建立基于SharpCamera的摄像 ...

  9. [08001] Could not create connection to database server. Attempted reconnect 3 times. Giving up IDEA2019的database插件无法链接mysql的解决办法(08001错误)

    [08001] Could not create connection to database server. Attempted reconnect 3 times. Giving up. 点击这里 ...

  10. Vue安装及项目介绍

    目录 创建Vue项目 环境安装 创建项目 pycharm打开Vue项目 项目目录介绍 入口文件(main.js) 路由配置(router.js ) 组件 前台路由的基本工作流程 目录结构 根组件(Ap ...