平衡二叉树:指的是左右子树高度差的绝对值不超过一的二叉排序树。

主要思路: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)相关推荐

  1. java 学生信息的增删改查_学生信息的增删改查(java)

    学生信息的增删改查 注意:此处用到的是access数据库. 运行后效果如图: 代码如下: package example; import java.awt.*; import java.awt.eve ...

  2. 一对一、一对多、多对多模型关系的建立和增删改查要注意的问题

    一对一.一对多.多对多模型关系的建立和增删改查要注意的问题 一对一: 1.在维护关系的一方使用:models.OneToOneField(另一个一方模型类名称,on_delete=models.CAS ...

  3. mysql常规使用(建立,增删改查,视图索引)

    目录 1.数据库建立 2.增删改查 3.视图建立: 1.数据库建立 mysql> mysql> show databases; +----------------------------- ...

  4. 【Laravel】Laravel-admin后台框架-2创建数据表建立模块增删改查CURD(2)

    前言 前面的操作我们已经能够 安装Laravel-admin 创建数据表并生成模型 修改模型实现按业务写入数据 可以参考之前的文章 [Laravel]Laravel-admin后台框架-2创建数据表建 ...

  5. 玩下软工项目,第一轮--全局Context的获取,SQLite的建立与增删改查,读取用户通话记录信息...

    项目的Github地址:https://github.com/ggrcwxh/LastTime 采用基于git的多人协作开发模式 软件采用mvc设计模式,前端这么艺术的事我不太懂,交给斌豪同学去头疼了 ...

  6. java部门管理_系统管理模块_部门管理_实现基本的增删改查功能

    系统管理模块_部门管理1_实现基本的增删改查功能 先不考虑上级部门 设计实体.表 1.设计实体 Department.java public classDepartment {privateLong ...

  7. 高度平衡二叉树的构建_平衡二叉树(AVL)树

    1.平衡二叉树定义 是一种二叉排序树(二叉查找树.二叉搜索树),其中每个节点的左子树和右子树的高度差不大于1.(左右子树也是平衡二叉树) 平衡因子BF = 二叉树节点的左子树深度减去右子树深度 = 节 ...

  8. 高度平衡二叉树的构建_平衡二叉树 构造方法(绝妙)

    构造方法 平衡二叉树 对于二叉查找树,尽管查找.插入及删除操作的平均运行时间为 O(logn) ,但是它们的最差 运行时间都是 O(n), 原因在于对树的形状没有限制. 平衡二叉树又称为 AVL 树, ...

  9. java 数据库操作教程_数据库基本操作:增删改查及联表操作

    所用软件:SQL Server Management Studio 首先第一步,建立一个表.在这里命名为T1.并在里面填入几条数据.如图: T1 一.查询 查询所有:select  * from T1 ...

最新文章

  1. 经典算法题每日演练——第十题 树状数组
  2. Java后端开发需具备什么技术?这几个部分你需要关注
  3. php读取三维数组,php 读取多维数组方法_PHP教程
  4. 【Linux】shell命令学习之find
  5. 安卓学习笔记42:基于HTTP网络编程
  6. angularjs中的数据绑定
  7. CDOJ 1805 矩阵 数学
  8. 研究生,怎么经济独立?
  9. uniapp debug能打开release不行_盘点在 Release 下由循环体优化所产生的不确定性 Bug...
  10. Docker国内Yum源和国内镜像仓库
  11. 使用对象方式管理XML文件
  12. 将Session写入数据库
  13. VB.NET/C# Free Grid Control 免费开源表格控件 - ReoGrid 介绍(1)
  14. 汽车电子测试-软件测试
  15. 根据图片名批量创建文件夹
  16. 准备工作-PPT母版
  17. 无线连接网络找不到计算机组,无线网络连接不见了的4个解决方法!电脑无线网络连接找不到如何解决?...
  18. 我在美团Android研发岗工作的那5年,终局之战
  19. 完美C Perfect C 丰胸胶囊
  20. mac下 Github添加SSH keys

热门文章

  1. MySQL8小时连接超时断开问题
  2. linux efi不要boot目录,LINUX下EFIBOOTMGR的使用,删除UEFI主板多余启动项和添加启动项-Go语言中文社区...
  3. 扩展坞可以把手机投到显示器吗_你的电脑可以省了!华为Mate 30搭配绿联新一代扩展坞轻松变电脑...
  4. spring boot 缓存_SpringBoot 应用 Redis 声明式缓存
  5. Git cherry-pick 使用总结
  6. 手挽手带你学React:三档 React-router4.x的使用
  7. Dora.Interception,为.NET Core度身打造的AOP框架 [5]:轻松地实现与其他AOP框架的整合...
  8. c语言打印一个整数的二进制形式
  9. ViewPager onPageChangeListener总结
  10. Excel 自动更正选项