平衡二叉树(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树). 平衡二叉树介绍 在上篇博客中所实现的二叉排序树(二叉搜索树),其查找性能取决于二叉排序树的形状,当二叉排 ...
随机推荐
- CentOS7 下 yum 安装 Docker CE
前言 Docker 使用越来越多,安装也很简单,本次记录一下基本的步骤. Docker 目前支持 CentOS 7 及以后的版本,内核要求至少为 3.10. Docker 官网有安装步骤,本文只是记录 ...
- Java学习之旅(一):探索extends
鄙人为兴趣爱好,0基础入门学习Java,有些心得想法,记录于此,与君分享. 然毕竟新手,学识尚浅,错误之处,希望多多指正批评,也是对我最大的帮助! 前言:本篇文章,主要讨论在子类继承父类之后,一些继承 ...
- C语言交换两个指针所指位置的数值
交换指针变量x和y所指向的存储位置处存放的值,不需要第三个位置来存储临时变量.这种方式并没有性能上的优势. void replace(int *x, int *y) { *y = *x ^ *y; * ...
- stm32 普通IO口模拟串口通信
普通IO口模拟串口通信 串口通信协议 串口传输 默认 波特率9600 1起始位 1停止位 其他0 数据位是8位(注意图上的给错了). 传输时,从起始位开始,从一个数据的低位(LSB)开始发送,如图从左 ...
- 干货|Dubbo社区开发者日经验分享
Hello,各位小伙伴大家好,我是小栈君,昨天也就是2019年10月26日,有幸在成都参加了由阿里举办的"Dubbo社区开发者日". 本次活动汇聚了各方面的大神欢聚一堂,主要是对现 ...
- 【leetcode-22】括号生成
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为: [ "((()))", "(()())& ...
- Micro 设计文档
1.顶部 即时通讯 | 应用软件 | 网络学院 | 帮助中心 | 开发者中心 | 控制台 2.导航 首页 免费制作 免费下载 功能介绍 示例演示 云数据 支持与服务 免费制作:https://www. ...
- python基础04--list,cou,dict
1.1 列表list 1.列表可以完成大多数集合类的数据结构实现.列表中元素的类型可以不相同,它支持数字,字符串,列表,元组,集合,字典 2.列表是有序的, 可以索引,切片 3.List中的元素是可以 ...
- Java自学-数字与字符串 操纵字符串
Java常见字符串方法 示例 1 : 获取字符 charAt(int index)获取指定位置的字符 package character; public class TestString { publ ...
- Nginx中的break和last
rewrite中的break和last 两个指令用法相同,但含义不同,需要放到rewrite规则的末尾,用来控制重写后的链接是否继续被nginx配置执行(主要是rewrite.return指令). 示 ...