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 表分区分类

    针对Mysql数据库,表分区类型简析. [1]表分区类型 (1)Range分区:按范围分区.按列值的范围区间进行分区存储:比如:id小于10存储在一个分区:id大于10小于20存储在另外一个分区: ( ...

  2. .net Core MongoDB用法演示

    C#驱动MongoDB的本质是将C#的操作代码转换为mongo shell,驱动的API也比较简单明了,方法名和js shell的方法名基本都保持一致,熟悉mongo shell后学习MongoDB的 ...

  3. 「NOI2018」冒泡排序

    「NOI2018」冒泡排序 考虑冒泡排序中一个位置上的数向左移动的步数 \(Lstep\) 为左边比它大的数的个数,向右移动的步数 \(Rstep\) 为右边比它大的数的个数,如果 \(Lstep,R ...

  4. c# 读取文件目录下的信息

    private void button1_Click(object sender, System.EventArgs e) { //浏览文件夹 this.folderBrowserDialog1.Sh ...

  5. springboot WebMvcConfigurer配置静态资源和解决跨域

    前言 虽然现在都流行前后端分离部署,但有时候还是需要把前端文件跟后端文件一起打包发布,这就涉及到了springboot的静态资源访问的问题.不单只是静态资源打包,比如使用本地某个目录作为文件存储,也可 ...

  6. Java自学-接口与继承 多态

    Java的多态 操作符的多态 +可以作为算数运算,也可以作为字符串连接 类的多态 父类引用指向子类对象 示例 1 : 操作符的多态 同一个操作符在不同情境下,具备不同的作用 如果+号两侧都是整型,那么 ...

  7. pandas-22 数据去重处理

    pandas-22 数据去重处理 数据去重可以使用duplicated()和drop_duplicates()两个方法. DataFrame.duplicated(subset = None,keep ...

  8. Redux 中间件和异步操作

    回顾一下Redux的数据流转,用户点击按钮发送了一个action,  reducer 就根据action 和以前的state 计算出了新的state, store.subscribe 方法的回调函数中 ...

  9. JavaScript 变量与注释

    一.变量 ECMAScript 的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据. 换句话说,每个变量仅仅是一个用于保存值的占位符而已.定义变量时要使用 var 操作符(注意 var 是 ...

  10. JavaScript 之 事件(详解)

    一.注册事件的三种方式 1.直接事件方式 语法格式: 变量名.on事件名 = function() {} 注意:这种方式无法给同一对象的同一事件注册多个事件处理函数 2.addEventListene ...