平衡二叉树(Java)
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)的更多相关文章
- 平衡二叉树 JAVA实现 亲测可用
平衡二叉树的JAVA实现 亲测可用 包括LL LR RL RR四种情况的旋转算法 以及添加删除树结点之后对平衡二叉树的维护算法 都已经实现并测试过 没有问题. 代码地址可以直接上我的GIT clone ...
- 数据结构-平衡二叉树Java实现
1,Node.java package com.cnblogs.mufasa.BalanceBinaryTree; public class Node { Node parent; Node left ...
- leetcode-110:判断平衡二叉树 Java
Balanced Binary Tree Given a binary tree, determine if it is height-balanced. For this problem, a he ...
- 平衡二叉树--java
package com.test.tree; /** * 带有平衡条件的二叉查找树 * */ public class AVLBinarySearchTree<T extends Compara ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- Java实现平衡二叉树(AVLTree)的构建
近期在学习数据结构上关于平衡二叉树的知识,看了严老师的思路,感觉用java写出递归的构建方式有点困难,由于当中的递归须要把引用传进去,所以感觉是要实现起来比較麻烦,所以就首先想到使用非递归的方式来实现 ...
- 平衡二叉树(AVL)java实现
数的节点 package com.ydp.tree.AVLTree; public class Node{ private int data = 0; private Node lchild = nu ...
- 平衡二叉树的java实现
转载请注明出处! 一.概念 平衡二叉树是一种特殊的二叉搜索树,关于二叉搜索树,请查看上一篇博客二叉搜索树的java实现,那它有什么特别的地方呢,了解二叉搜索树的基本都清楚,在按顺序向插入二叉搜索树中插 ...
- 【Java】 剑指offer(55-2) 平衡二叉树
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一棵二叉树的根结点,判断该树是不是平衡二叉树.如果某二叉树 ...
- 【Java】 大话数据结构(12) 查找算法(3) (平衡二叉树(AVL树))
本文根据<大话数据结构>一书及网络资料,实现了Java版的平衡二叉树(AVL树). 平衡二叉树介绍 在上篇博客中所实现的二叉排序树(二叉搜索树),其查找性能取决于二叉排序树的形状,当二叉排 ...
随机推荐
- FPGA控制RGMII接口PHY芯片基础
一.前言 网络通信中的PHY芯片接口种类有很多,之前接触过GMII接口的PHY芯片RTL8211EG.但GMII接口数量较多,本文使用RGMII接口的88E1512搭建网络通信系统.这类接口总线位宽小 ...
- vue nexttick的理解和使用场景
应用场景 需要在视图更新之后,基于新的视图进行操作 文档说明 在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM nextTick原理 1.异步说明 V ...
- ABP 使用cache缓存
using Abp.Application.Services.Dto; using Abp.Runtime.Caching; using Microsoft.Extensions.Configurat ...
- 手机端 关闭当前页面的JS
JS 代码如下 PS:我找的原代码中, 注释部分是没有注释的,但是调试的时候报错,就注释掉了,因为我只需要微信和支付宝的判定,所以这个地方,就没仔细研究 var isLppzApp = false ...
- Configuration property name 'xxx' is not valid
目录 问题 解决 问题 程序出错:Configuration property name ‘xxx’ is not valid, Canonical names should be kebab-cas ...
- tensorflow中使用变量作用域及tf.variable(),tf,getvariable()与tf.variable_scope()的用法
一 .tf.variable() 在模型中每次调用都会重建变量,使其存储相同变量而消耗内存,如: def repeat_value(): weight=tf.variable(tf.random_no ...
- MySQL--用户管理 pymysql 索引
目录 用户管理 创建mysql账户 权限管理 涉及到的表 pymysql 索引 语法 结论 用户管理 主要是为了控制权限,让不同的人只能操作只属于只记得那部分数据 创建mysql账户 账户中涉及三个数 ...
- Java 8 New Features
What's New in JDK 8 https://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html Java Pla ...
- 计算n阶乘中尾部零的个数
大佬答案 大佬的思路看了好久,每次看都会明白一丢丢,现在还有不明白的地方,但是要往后继续加油了,知新温故. 结论:参与阶乘的所有数的因子中只要存在一个2和一个5就会在阶乘的结果中产生一个0. 又因为因 ...
- 如何为scratch3.0创建一个独立的页面或窗体
很多人都利用GIT上的scratch3.0做开发,但是苦于有些定制需要个性化开发但是不知道如何动手.本篇文章来做好普及工作吧. 首先需要完成事项如下: 1.需要进行modal定义 2.新增窗口的UI界 ...