高度平衡二叉树的构建_平衡二叉树建立及其增删改查(JAVA)
平衡二叉树:指的是左右子树高度差的绝对值不超过一的二叉排序树。
主要思路:1、用左高度跟右高度代替平衡因子,大于1进行L~调整,小于-1进行R~调整
2、每次插入都通过递归计算一次各结点高度,然后进行旋转调整
3、判断旋转操作时只需判断从失衡节点开始前两个节点 LL:左左左 、 RR:右右右 、 LR:左右~ 、RL:右左~
坑:贯穿整个树的各个部分的就是值传递跟引用传递l,因为java中主要是值传递,详见:引用传递跟值传递详解
1、t后还附带孩6子节点,并不是单个节点(执行旋转操作时)
2、BalanceTree tree = t; tree跟t指向同一个内存地址
3、BalanceTree tree = new BalanceTree(); tree跟t不是同一个地址
4、判断旋转操作时只需判断从失衡节点开始前两个节点 LL:左左左 、 RR:右右右 、 LR:左右~ 、RL:右左~
5、递归一定要加上=号,否则可能造成值传不回来
想要实现平衡二叉树的建立,就要了解它的四种旋转调节方式:LL 、RR 、LR 、RL
LL:这种调整是因为在失衡节点的左孩子的左子树插入结点造成的。
RR:这种调整是因为在失衡节点的右孩子的右子树插入结点造成的。
LR:这种调整是因为在失衡节点的左孩子的右子树插入结点造成的。(两种情况)
左孩子的右子树的左孩子上添加导致失衡:
左孩子的右子树的右孩子上添加导致失衡:
RL:这种调整是因为在失衡节点的右孩子的左子树插入结点造成的。
右孩子的左子树的左孩子上插入导致失衡:
右孩子的左子树的右孩子上插入导致失衡:
代码:
package test;
/**
* @author HRX
* @version 创建时间:2018年10月3日 下午3:23:57
* 类说明
* 坑:1、t后还附带孩6子节点,并不是单个节点(执行旋转操作时)
* 2、BalanceTree tree = t; tree跟t指向同一个内存地址
* 3、BalanceTree tree = new BalanceTree(); tree跟t不是同一个地址
* 4、判断旋转操作时只需判断从失衡节点开始前两个节点 LL:左左左 、 RR:右右右 、 LR:左右~ 、RL:右左~
* 5、递归一定要加上=号,否则可能造成值传不回来
*/
public class BalanceTree {
private int data = 0;
private BalanceTree nextLeftTree;//左子树
private BalanceTree nextRightTree;//右子树
private int Lheight = 0;//左高度
private int Rheight = 0;//右高度
BalanceTree(){}//无参构造函数
BalanceTree(int xdata){
this.data = xdata;
}
//左旋调整
public BalanceTree LL(BalanceTree t){
BalanceTree t1 = new BalanceTree();
t1 = t.nextLeftTree;//t1指向t的左孩子
t.nextLeftTree = t1.nextRightTree;
t1.nextRightTree = t;//t1的右孩子指向t
return t1;
}
//右旋调整
public BalanceTree RR(BalanceTree t){
BalanceTree t1 = new BalanceTree();
t1 = t.nextRightTree;//t1指向t的右孩子
t.nextRightTree = t1.nextLeftTree;
t1.nextLeftTree = t;//t1的左孩子指向t
return t1;
}
public BalanceTree LR(BalanceTree t){
t.nextLeftTree = RR(t.nextLeftTree);
t = LL(t);
return t;
}
public BalanceTree RL(BalanceTree t){
t.nextRightTree = LL(t.nextRightTree);
t = RR(t);
return t;
}
//保持平衡操作
public BalanceTree ChangeToBalance(BalanceTree tree,int value){
if(tree == null)
return tree;
AddHeight(tree);
if(tree.Lheight - tree.Rheight > 1){
if(value < tree.data && value >tree.nextLeftTree.data){
System.out.println("执行LR平衡调整!");
tree = LR(tree);
}
else{
System.out.println("执行LL平衡调整!");
tree = LL(tree);
}
}
else if(tree.Lheight - tree.Rheight < -1){
if(value > tree.data && value
System.out.println("执行RL平衡调整!");
tree = RL(tree);
}
else{
System.out.println("执行RR平衡调整!");
tree = RR(tree);
}
}
if(value < tree.data)
tree.nextLeftTree = ChangeToBalance(tree.nextLeftTree,value);//注意一定要等于 值传递!!!!!!!
else
tree.nextRightTree = ChangeToBalance(tree.nextRightTree,value);
return tree;
}
//计算各节点左右子树高度
public void AddHeight(BalanceTree tree){
if(tree == null)
return;
AddHeight(tree.nextLeftTree);//上下顺序很重要
AddHeight(tree.nextRightTree);
tree.Lheight = maxHeight(tree.nextLeftTree);
tree.Rheight = maxHeight(tree.nextRightTree);
}
//辅助计算左右子树高度
public int maxHeight(BalanceTree tree){
if(tree != null)
return tree.Lheight >= tree.Rheight ? tree.Lheight+1 : tree.Rheight+1;
else
return 0;
}
//遍历二叉树(中序遍历)
public static void ergodic (BalanceTree tree){
if(tree == null) return;
System.out.println(tree.data);
ergodic(tree.nextLeftTree);
ergodic(tree.nextRightTree);
}
//插入操作
public BalanceTree InTree(BalanceTree tree , int value){
BalanceTree tree2 = new BalanceTree();
if(tree.data == 0){
tree.data = value;
return tree;
}
tree2 = tree;
while(tree2 != null){
if(value < tree2.data){
System.out.println("左"+"value:"+value);
if(tree2.nextLeftTree != null){
tree2 = tree2.nextLeftTree;
}
else{
tree2.nextLeftTree = new BalanceTree(value);
break;
}
}
if(value >= tree2.data){
System.out.println("右"+"value:"+value);
if(tree2.nextRightTree != null){
tree2 = tree2.nextRightTree;
}
else{
tree2.nextRightTree = new BalanceTree(value);
break;
}
}
}
System.out.println((tree.Lheight +":::" +tree.Rheight));
tree = ChangeToBalance(tree,value);
return tree;
}
//查找节点
public BalanceTree findNode (BalanceTree tree ,int value){
while(tree !=null){
if(value < tree.data)
tree = tree.nextLeftTree;
else if(value > tree.data)
tree = tree.nextRightTree;
else if(value == tree.data)
return tree;
}
System.out.println("不存在要查询的数据!!!!");
return null;
}
//删除节点
public BalanceTree deleteNode (BalanceTree tree ,int value){
BalanceTree t = new BalanceTree();
BalanceTree parent = null;//一定要是null作为是否是删除根节点的判断
t = tree;
while(tree !=null&&value != t.data){
parent = t;
if(value < t.data)
t = t.nextLeftTree;
else if(value > t.data)
t = t.nextRightTree;
}
if(t == null)
System.out.println("不存在要删除的数据!!!!");
else if(t.nextLeftTree !=null && t.nextRightTree != null){
BalanceTree tree2 = t.nextRightTree;
BalanceTree pre = t;
while(tree2.nextLeftTree != null){
pre = tree2;
tree2 = tree2.nextLeftTree;
}
t.data = tree2.data;
if(pre == t)
pre.nextRightTree = tree2.nextRightTree;//不需要判断tree2.nextRightTree 是不是null,为空就给他赋值为空
else
pre.nextLeftTree = tree2.nextRightTree;
}
else{
BalanceTree tree3;
if(t.nextLeftTree == null) tree3 = t.nextRightTree;
else tree3 = t.nextLeftTree;
if(parent == null)
return tree3;
else if(parent.nextLeftTree == t) parent.nextLeftTree = tree3;
else parent.nextRightTree = tree3;
}
return tree;
}
//修改节点
public BalanceTree changeNode (BalanceTree tree ,int oldvalue ,int newvalue){
BalanceTree t = new BalanceTree();//会破坏排序树的性质
t = tree;
while(tree !=null){
if(oldvalue < t.data)
t = t.nextLeftTree;
else if(oldvalue > t.data)
t = t.nextRightTree;
else if(oldvalue == t.data){
t.data = newvalue;
return tree;
}
}
System.out.println("不存在要修改的数据!!!!");
return tree;
}
public static void main(String[] args) {
BalanceTree aBalanceTree = new BalanceTree();
//int[] num = {20,12,6,28,16,36,32,10,2,30,8};
int[] num = {20,12,6,28,16,36,32};
for(int n : num){
aBalanceTree = aBalanceTree.InTree(aBalanceTree, n);
}
ergodic(aBalanceTree);
System.out.println("-------------------------------");
BalanceTree aaa = aBalanceTree.deleteNode(aBalanceTree, 32);
ergodic(aaa);
}
}
高度平衡二叉树的构建_平衡二叉树建立及其增删改查(JAVA)相关推荐
- java 学生信息的增删改查_学生信息的增删改查(java)
学生信息的增删改查 注意:此处用到的是access数据库. 运行后效果如图: 代码如下: package example; import java.awt.*; import java.awt.eve ...
- 一对一、一对多、多对多模型关系的建立和增删改查要注意的问题
一对一.一对多.多对多模型关系的建立和增删改查要注意的问题 一对一: 1.在维护关系的一方使用:models.OneToOneField(另一个一方模型类名称,on_delete=models.CAS ...
- mysql常规使用(建立,增删改查,视图索引)
目录 1.数据库建立 2.增删改查 3.视图建立: 1.数据库建立 mysql> mysql> show databases; +----------------------------- ...
- 【Laravel】Laravel-admin后台框架-2创建数据表建立模块增删改查CURD(2)
前言 前面的操作我们已经能够 安装Laravel-admin 创建数据表并生成模型 修改模型实现按业务写入数据 可以参考之前的文章 [Laravel]Laravel-admin后台框架-2创建数据表建 ...
- 玩下软工项目,第一轮--全局Context的获取,SQLite的建立与增删改查,读取用户通话记录信息...
项目的Github地址:https://github.com/ggrcwxh/LastTime 采用基于git的多人协作开发模式 软件采用mvc设计模式,前端这么艺术的事我不太懂,交给斌豪同学去头疼了 ...
- java部门管理_系统管理模块_部门管理_实现基本的增删改查功能
系统管理模块_部门管理1_实现基本的增删改查功能 先不考虑上级部门 设计实体.表 1.设计实体 Department.java public classDepartment {privateLong ...
- 高度平衡二叉树的构建_平衡二叉树(AVL)树
1.平衡二叉树定义 是一种二叉排序树(二叉查找树.二叉搜索树),其中每个节点的左子树和右子树的高度差不大于1.(左右子树也是平衡二叉树) 平衡因子BF = 二叉树节点的左子树深度减去右子树深度 = 节 ...
- 高度平衡二叉树的构建_平衡二叉树 构造方法(绝妙)
构造方法 平衡二叉树 对于二叉查找树,尽管查找.插入及删除操作的平均运行时间为 O(logn) ,但是它们的最差 运行时间都是 O(n), 原因在于对树的形状没有限制. 平衡二叉树又称为 AVL 树, ...
- java 数据库操作教程_数据库基本操作:增删改查及联表操作
所用软件:SQL Server Management Studio 首先第一步,建立一个表.在这里命名为T1.并在里面填入几条数据.如图: T1 一.查询 查询所有:select * from T1 ...
最新文章
- 经典算法题每日演练——第十题 树状数组
- Java后端开发需具备什么技术?这几个部分你需要关注
- php读取三维数组,php 读取多维数组方法_PHP教程
- 【Linux】shell命令学习之find
- 安卓学习笔记42:基于HTTP网络编程
- angularjs中的数据绑定
- CDOJ 1805 矩阵 数学
- 研究生,怎么经济独立?
- uniapp debug能打开release不行_盘点在 Release 下由循环体优化所产生的不确定性 Bug...
- Docker国内Yum源和国内镜像仓库
- 使用对象方式管理XML文件
- 将Session写入数据库
- VB.NET/C# Free Grid Control 免费开源表格控件 - ReoGrid 介绍(1)
- 汽车电子测试-软件测试
- 根据图片名批量创建文件夹
- 准备工作-PPT母版
- 无线连接网络找不到计算机组,无线网络连接不见了的4个解决方法!电脑无线网络连接找不到如何解决?...
- 我在美团Android研发岗工作的那5年,终局之战
- 完美C Perfect C 丰胸胶囊
- mac下 Github添加SSH keys
热门文章
- MySQL8小时连接超时断开问题
- linux efi不要boot目录,LINUX下EFIBOOTMGR的使用,删除UEFI主板多余启动项和添加启动项-Go语言中文社区...
- 扩展坞可以把手机投到显示器吗_你的电脑可以省了!华为Mate 30搭配绿联新一代扩展坞轻松变电脑...
- spring boot 缓存_SpringBoot 应用 Redis 声明式缓存
- Git cherry-pick 使用总结
- 手挽手带你学React:三档 React-router4.x的使用
- Dora.Interception,为.NET Core度身打造的AOP框架 [5]:轻松地实现与其他AOP框架的整合...
- c语言打印一个整数的二进制形式
- ViewPager onPageChangeListener总结
- Excel 自动更正选项