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. 【转帖】Alpha、Beta、RC、GA版本的区别

    [版本]Alpha.Beta.RC.GA版本的区别 https://www.jianshu.com/p/d69226decbfe Alpha:是内部测试版,一般不向外部发布,会有很多Bug.一般只有测 ...

  2. NodeJS安装及部署(Linux系统)

    环境说明:Linux环境,CentOS 7版本. 第一步:下载node地址:https://nodejs.org/en/download/ 下载后,是一个[node-v10.16.0-linux-x6 ...

  3. Django 模板语言 变量名称

    Django 模板语言 变量名称 模板语言中已变量形式显示 # view 文件内 def func(request): return render(request,"index.html&q ...

  4. FusionInsight大数据开发---Hive应用开发

    Hive应用开发 了解Hive的基本架构原理 掌握JDBC客户端开发流程 了解ODBC客户端的开发流程 了解python客户端的开发流程 了解Hcatalog/webHcat开发接口 掌握Hive开发 ...

  5. java基础 抽象

    /** * 抽象方法:就是加上abstract关键字,并去掉大括号,分号结束 * 抽象类:抽象方法坐在的类,必须是抽象类.在class前家abstract即可 * * 如何使用抽象类和抽象方法: * ...

  6. ASP.NET Core 静态文件

    静态文件(HTML,CSS,图片和Javascript之类的资源)会被ASP.NET Core应用直接提供给客户端. 静态文件通常位于网站根目录(web root) <content-root& ...

  7. Win10安装IIS并配置ASP.NET 4.0

    这几天新购置了电脑家用,自家电脑上上了win10+Ubuntu.解决了双系统的一些坑之后,今天准备给win10装IDE了(虽然想在Ubuntu下搞搞React/Python之类的,但我骨子里还是个.N ...

  8. .Net Core 程序集管理说明(加载)

    .NET CORE 的程序集加载管理和以前的 .NET 发生了很大的变化, 在 .NET CORE 里, 程序集的加载, 依赖了 xx.deps.json 文件, deps.json 文件里,定义了程 ...

  9. Java3-5年经验面试题总结

    记录一下本次找工作所遇到的一些高频面试题,第一次找java工作,感觉比面试.net舒服多了,17年的时候出去找.net工作,由于在公司做的东西用到的技术少,除了mvc和ef,其他没啥问的,就追着项目问 ...

  10. python基础--py2与py3编码

    python2 与 python3的编码和解码 注意:小心,容易弄混 目录: 1.python2d 的encode & decode 2.python3的encode & decode ...