平衡二叉树的插入操作(java)

Java版二叉树的递归和非递归遍历算法 二叉树是一种常见的数据结构,它由节点组成,每个节点最多有两个子节点:左子节点和右子节点。在本文中,我们将介绍如何使用递归和非递归算法实现二叉树的三种遍历方式:前序遍历、中序遍历和后序遍历。在循环中,我们将当前节点的左子节点全部入栈,直到没有左子节点。在循环中,我们弹出栈顶节点并访问它,然后先将右子节点入栈(如果存在),再将左子节点入栈(如果存在)。在递归遍历中,我们从根节点开始,先访问根节点,然后递归地遍历左子树,最后递归地遍历右子树。为了验证我们实现的遍历算法,我们可以创建一个二叉树,并对其进行遍历。 阅读详情

平衡二叉树

 1.平衡二叉树是特殊的二叉查找树,为了解决二叉查找树查找时间复杂度变大的问题
 2.平衡二叉树AVL:该树的每个节点的左子树与右子树的高度差的绝对值为1(-1,0,1) 该差值也称为平衡因子(BF)
 3. 插入和删除节点都有可能导致平衡二叉树失衡,这里只讨论插入操作使AVL失衡的情况,

插入节点导致平衡二叉树失衡的情况有4种:(x节点为失衡点)

  1.  在节点X的左孩子节点的左子树中插入元素
  2.  在节点X的左孩子节点的右子树插入元素;
  3.  在节点X的右孩子节点的左子树插入元素;
  4.  在节点X的右孩子节点的右子树插入元素;

补充:高度:指当前节点到其叶子节点的最长路径;所有叶子节点的高度都为0,空树的高度为-1; 深度:根节点到当前节点的最长路径,根节点的深度为0;

public class AVL_Tree {

	/**
	 * 情况一:在节点X的左孩子节点的左子树中插入元素 返回旋转后的根节点 把 x(B(A)) ==> B(A,X)
	 */
	public static BsNode situationOne(BsNode x) {
		System.out.println("===============>> 失衡:情况一");
		BsNode B = x.left;
		x.left = null;
		B.right = x;
		B.parent = x.parent;

		if (x.parent != null) {
			if (x.parent.left == x) {
				x.parent.left = B;
			} else {
				x.parent.right = B;
			}
		}

		x.parent = B;

		return B;
	}

	/**
	 * 情况二:在节点X的左孩子节点的右子树插入元素;
	 * 
	 * @return 返回旋转后的节点 把 x(B(A)) ==> A(B,X)
	 */
	public static BsNode situationTwo(BsNode x) {
		System.out.println("===============>> 失衡:情况二");
		BsNode B = x.left;
		BsNode A = B.right;
		B.right = null;
		B.parent = A;
		A.left = B;
		x.left = null;
		A.right = x;
		A.parent = x.parent;

		if (x.parent != null) {
			if (x.parent.left == x) {
				x.parent.left = A;

			} else {
				x.parent.right = A;
			}
		}
		x.parent = A;
		return A;
	}

	/**
	 * 情况三:在节点X的右孩子节点的左子树插入元素;
	 * 
	 * @return 返回旋转后的节点 把 x(B(A)) ==> A(X,B)
	 */
	public static BsNode situationThree(BsNode x) {
		System.out.println("===============>> 失衡:情况三");
		BsNode B = x.right;
		BsNode A = B.left;
		B.left = null;
		B.parent = A;
		A.right = B;

		x.right = null;
		A.left = x;
		A.parent = x.parent;

		if (x.parent != null) {
			if (x.parent.left == x) {
				x.parent.left = A;
			} else {
				x.parent.right = A;
			}
		}
		x.parent = A;
		return B;
	}

	/**
	 * 情况四:在节点X的右孩子节点的右子树插入元素;
	 * 
	 * @return 返回旋转后的节点 把 x(B(A)) ==> B(X,A)
	 */
	public static BsNode situationFour(BsNode x) {
		System.out.println("===============>> 失衡:情况四");
		BsNode B = x.right;
		x.right = null;
		B.left = x;
		B.parent = x.parent;

		if (x.parent != null) {
			if (x.parent.left == x) {
				x.parent.left = B;
			} else {
				x.parent.right = B;
			}
		}
		x.parent = B;
		return B;
	}

	/**
	 * 计算节点的高度
	 */
	public static int getNodeHei(BsNode node) {
		if (node == null) {
			return 0;
		}
		int h = Math.max(getNodeHei(node.left), getNodeHei(node.right)) + 1;
		return h;
	}

	/**
	 * 获取节点的平衡因子BF
	 */
	public static int getNodeBf(BsNode node) {
		if (node == null) {
			return 0;
		}
		return Math.abs(getNodeHei(node.left) - getNodeHei(node.right));
	}

	/**
	 * 插入节点 1. 如果二叉查找树为空,根节点的key为data 2.二叉查找树不为空: 2.1 比较data与root的键值 2.2
	 * 若大于,则判断右子树是否为空,如为空,插入,不为空,继续执行2.1 -- 递归 2.2 若小于,判断左子树是否为空,为空,插入,不为空,继续执行2.1
	 * -- 递归 2.3若相等,return;
	 */
	public static void insert(BsNode root, int data) {
		if (root == null) {
			root = new BsNode(data);
		}

		if (data < root.key) {
			if (root.left == null) {
				root.left = new BsNode(data, null, null, root);
			} else {
				insert(root.left, data);
				// 计算该树的平衡因子
				int bf = getNodeBf(root);
				System.out.println("1:插入后的Bf = " + bf);
				if (bf == 2) {
					// 判断是情况一还是情况二?
					if (data < root.left.key) { // 情况一
						situationOne(root);
					} else { // 情况二
						situationTwo(root);
					}
				}
			}
		} else if (data > root.key) {
			if (root.right == null) {
				root.right = new BsNode(data, null, null, root);
			} else {
				insert(root.right, data);
				// 计算平衡因子
				int bf = getNodeBf(root);
				System.out.println("2:插入后的Bf = " + bf);
				if (bf == 2) {
					// 判断是情况三还是情况四?
					if (data < root.right.key) { // 情况三
						situationThree(root);
					} else { // 情况四
						situationFour(root);
					}
				}
			}
		} else {
			return;
		}

	}
	
	//测试
	public static void main(String[] args) {
		// 叶子节点
		Binary_Search_Tree bst = new Binary_Search_Tree();
		
		BsNode root = new BsNode(9);
		insert(root, 5);
		insert(root, 13);
		
		//insert(root, 7);
		//insert(root, 6);// 右-左 -> 情况三
		//insert(root, 8); // 右-右 -> 情况四
		
		//insert(root, 12);
		//insert(root, 10); //左左 -> 情况一
		
		insert(root, 11);
		insert(root, 12); //左右 -> 情况二
		bst.LevelTree(root); //层次遍历
		
	}
}

 

平衡二叉课设+实验报告 C语言完成的平衡二叉树的一些基本操作。如调整、查找、插入、删除、合并、分裂、销毁等功能,并编写代码对所完成操作进行测试,同时包括实验报告。 立即下载

相关推荐

大漠多线程增强版:解决窗口消失、坐标错乱与识别卡死

多线程环境下窗口自动化面临的核心挑战,本质是GDI资源非线程安全、HWND生命周期失控及图像引擎状态污染三大底层问题。Windows GUI编程中,跨线程共享hDC、缓存失效的窗口句柄、OpenCV静态Mat等设计缺陷,导致FindPic失败、GetCursorPos异常、坐标跳变等典型故障。本方案通过线程局部存储(TLS)重构资源生命周期、WinEventHook+心跳探测构建实时窗口状态链、ABI对齐的多语言内存契约,实现稳定低延迟的并发UI识别与控制。适用于游戏多开监控、电商RPA、后台UI状态采集等

weixin_30561177的博客 477

平衡二叉树java实现(插入、删除、平衡调整)

平衡二叉树的构建、删除、调整算法分析及java实现

No_Words_的博客 952

单路径微分相除和微分自乘相减算法(PGC-SDD-DSM)

PGC-SDD-DSM算法通过融合单路微分相除和差分自乘,解决了传统PGC解调技术对调制深度和光强干扰敏感的问题,显著提升了解调稳定性和抗失真能力。其高信噪比、低谐波失真以及对参数变化的鲁棒性,使其在光纤传感领域具有重要应用价值。PGC-SDD-DSM算法在计算复杂度方面具有显著的优势,主要体现在其高稳定性和低谐波失真上。这些优势使其在光纤光学干涉传感器中表现出色,尤其是在面对光强干扰和调制深度变化时。

百态·数智思维 | 聚焦大数据、量化与未来AI 839

平衡二叉树-插入、删除(java代码)

二叉树定义 目录 一、概念 1、定义 2、平衡因子 3、最小不平衡子树 二、旋转纠正 1、旋转方式 2、旋转纠正类型 LL型 LR型 RR型 RL型 三、插入 四、删除 五、完整代码实现 一、概念 1、定义 规定任意结点的左右子树高度差不大于1,左右子树也是平衡二叉树 2、平衡因子 定义:左子树和右子树高度差 计算:左子树高度 - 右子树高度的值 别名:简称 BF(Balance Factor) 一般来说 BF 的绝对值大于 1,,平衡树二叉树就失衡,需要

weixin_37607613的博客 1978

利用Cesium引擎实现大疆智图B3DM三维模型的高效加载与可视化

本文详细介绍了如何利用Cesium引擎高效加载与可视化大疆智图B3DM三维模型。通过性能优化实战和典型应用场景分析,帮助开发者掌握模型预处理、渲染参数调优及高级功能实现技巧,提升大规模倾斜摄影数据的网页端展示效率。

weixin_29231725的博客 218

YonBIP 3.0 报表开发+报表超链接

用友报表开发

m0_55096250的博客 1757

平衡二叉树插入操作的详细过程图解

二叉搜索树/二叉排序树/二叉查找树 是二叉树、任意结点的左子树的值均小于根节点的值,右子树均大于根节点的值 没有键值相等 平衡二叉树(AVL树) 定义 左右字数的高度差的绝对值不超过1,并且两子树都是平衡二叉树 没有键值相等 高度差,又名平衡因子,范围为[-1,0,1],在此规定==平衡因子 bf = 右子树的高度-左子树的高度== 插入操作 当有新的结点...

jinking01的专栏 1万+

【51单片机仿真】基于51单片机设计的多功能电子时钟日历(实时时钟闹钟秒表温度检测)系统__资料编号5

该项目是基于单片机的多功能电子时钟系统,集成了时间显示、闹钟设置、秒表功能以及温度显示等功能。主要硬件包括1602液晶显示屏、DS1302时钟芯片、DS18B20温度传感器和蜂鸣器。系统通过按键进行时间和闹钟的设置,并实时显示当前时间和温度。

嵌入式阿齐Archie 2万+

总结平衡二叉树概念、插入(旋转)对应java实现

一、定义及原理 平衡二叉树要求对于每一个节点来说,它的左右子树的高度之差不能超过1,如果插入或者删除一个节点使得高度之差大于1,就要进行节点之间的旋转,将二叉树重新维持在一个平衡状态。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了...

技术架构公社 690

基于YOLO26/11/v8算法的Web目标检测系统,人脸表情识别系统,Django+Vue3 的前后端分离,实现摄像头实时识别,YOLO26/YOLO11/v8 + LLM大模型智能分析,科研必备

在人工智能迈向通用化(AGI)的今天,“视觉感知 + 语言理解”的多模态联合是未来的趋势。单纯的检测画框已经无法满足复杂的业务需求,如何让系统“看懂”画面并进行“思考”,是当前视觉项目的重点。我们知道目标检测是计算机视觉中的重要任务,广泛应用于安防监控、自动驾驶、智能家居等领域。因此本项目将 YOLO 目标检测模型(兼容 YOLO26/v11/v8 系列)与 DeepSeek 等顶流大语言模型(LLM) 进行联合,使用 Django (后端) + Vue3 (前端) 技术栈

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2836

Yocto开发讲解系列 - 总目录

Yocto开发讲解系列总纲Yocto开发专栏前言

fulinux的博客 3万+

Java 代码实现平衡二叉树(插入、删除、查找、遍历操作)

Java 代码实现平衡二叉树 最近一直在看数据结构的相关内容,对于平衡二叉树这一节,理论看起很简单,无非是判断结点的平衡因子是否绝对值小于2。在插入或者删除之后进行相应的旋转调整。 我已开始试着按照书上所讲的内容进行编程,但是书上的代码皆是伪代码,只是告诉你一个思路,按照书上是实现不出来的,所以我决定在已有理论的情况下,试着按照自己的想法编程。 因为在前面的博客中,我已经介绍过了一般的二叉树的插入...

m0_37683327的博客 1068

【深度学习驱动流体力学】OpenFOAM目录流体力学求解器汇总介绍

下面这些目录结构和其中的求解器和工具展示了OpenFOAM作为一个功能强大且广泛应用的开源CFD软件框架的多样性和灵活性。每个求解器都专门用于解决不同类型的流体动力学问题,从基础的流动模拟到复杂的多相流动和燃烧模拟等各种应用场景。

源代码杀手的博客 1184

数据结构第四章树 平衡二叉树,实现插入,删除操作,Java实现,递归实现

二叉搜索树自动调整平衡(左右子树高度差小于等于1)——平衡二叉树 目录 1.编写测试程序,测试二叉树的四种平衡操作 2.编写内部类:树结点 3.根节点,类构造器 4.插入 5.平衡 5.1计算平衡值 5.2.计算深度 5.3.平衡节点(调用四个旋转的条件) 5.3.1. RR旋转 5.3.2. LL旋转 5.3.3. RL旋转 5.3.4. LR旋转 5.3.5. 逆...

qq_39980514的博客 934

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

平衡二叉树 java_面试官让我手写一个平衡二叉树,我当时就笑了(java代码实现)...

平衡二叉树对于初学者一直是一个比较复杂的知识点,因为其里面涉及到了大量的旋转操作。把大量的同学都给转晕了。这篇文章最主要的特点就是通过动画的形式演示。确保大家都能看懂。最后是手写一个平衡二叉树。一、概念平衡二叉树是外国的两个大爷发明的。一开始发明的是二叉查找树。后来觉得不给力演化成了平衡二叉树。那什么是二叉查找树呢?我们给出一张图来看看:看到这张图我们就会发现如下的特征。从每个节点出发,左边的节点...

weixin_34732602的博客 357

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

平衡二叉树Java实现

平衡二叉树Java实现平衡二叉树Java实现 平衡二叉树Java实现 static class TreeNode{ public int val; public TreeNode left; public TreeNode right; public TreeNode(int val){ this.val = val; } } static class BTree{

qq_36722687的博客 320

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【AVL平衡二叉树】JAVA代码实现

【AVL平衡二叉树】JAVA代码实现实现思路二叉查找树二叉查找树实现平衡二叉树实现如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 实现思路 AVL平衡二叉树,是在二叉查找树基础上加上了平衡功能,即依照平衡二叉树的规则插入数据之后,依旧要保证任意一个节点的左右子树深度相差不

weixin_42270132的博客 945

平衡二叉树排序树的操作

package com.utils; import java.util.Iterator; import java.util.NoSuchElementException; /** 平衡二叉树 定义:首先它是一种特殊的二叉排序树,其次它的左子树和右子树都是平衡二叉树, 且左子树和右子树的深度之差不超过1 平衡因子:可以定义为左子树的深度减去右子树的深度 平衡二叉树是对二叉排序...

study_way的博客 1814

Java树——平衡二叉树的建立

本文会介绍平衡二叉树的相关知识和代码。 平衡二叉树相比于一般树结构的特点是: 1. 任何结点子树的高度差都小于等于 1 2. 是一颗有序树。比根结点大的结点,作为右子节点。比根节点小的,做为左子节点。 平衡二叉树的意义就是依靠这种特殊结构,利用二分查找的思想,实现数据的快速查找。 平衡二叉树的一系列操作都建立在树结构的类之上。有关树的定义如下: Java树的定义 ...

Java 以及 后端,关注我,没错的 238

平衡二叉树的插入与删除

主要来源于:数据结构与算法 java语言描述 适合哪些人阅读:如果您已经对平衡二叉树的概念有一定了解,并且对插入时逻辑有一定了解,这篇文章提供不完整的代码实现。 阅读时间: 10分钟 平衡因子 定义:某节点的左子树与右子树的高度(深度)差即为该节点的平衡因子(BF,Balance Factor),平衡二叉树中不存在平衡因子大于 1 的节点。在一棵平衡二叉树中,节点的平衡因子只能取 0...

weixin_30646505的博客 218

Java二叉树的建立和增删改,平衡二叉树建立及其增删改查(JAVA)

平衡二叉树:指的是左右子树高度差的绝对值不超过一的二叉排序树。主要思路:1、用左高度跟右高度代替平衡因子,大于1进行L~调整,小于-1进行R~调整2、每次插入都通过递归计算一次各结点高度,然后进行旋转调整3、判断旋转操作时只需判断从失衡节点开始前两个节点 LL:左左左 、 RR:右右右 、 LR:左右~ 、RL:右左~坑:贯穿整个树的各个部分的就是值传递跟引用传递l,因为java中主要是值...

weixin_39724009的博客 235

平衡二叉树的创建和插入

平衡二叉树的创建和插入 import java.util.Random; public class BalancedBiSearchTree { private BTreeNode root; public BTreeNode getRoot() { return root; } public void setRoot(BTreeNode root) {...

qq_36368627的博客 311

平衡二叉树算法分析

1、平衡二叉树定义:  平衡二叉树(Balanced Binary Tree或Height-Balanced Tree)又称AVL树。它或者是一颗空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。若将二叉树上结点的平衡因子bf(balance factor)定义为该结点的左子树的深度减去右子树的深度,则平衡二叉树上所有结点的平衡因

JAVA-Miner 2030

平衡二叉树(AVL树)详解:Java实现与旋转操作全解析

T key;int height;// 节点高度,用于平衡计算// 新节点高度初始化为1AVL树通过严格的平衡条件和四种旋转机制,完美解决了二叉搜索树的退化问题。掌握其核心思想,不仅能提升数据结构理论水平,更能为理解现代数据库和编程语言的底层实现打下坚实基础。提示:在实际开发中,Java的TreeMap和C++的std::map使用的是红黑树而非AVL树,因为红黑树的旋转次数更少,更适合频繁插入删除的场景。但AVL树在查找密集型应用中仍有不可替代的优势。

qq_54076831的博客 904

平衡二叉树(AVL)的插入、删除、查找的java实现

平衡二叉树(AVL)操作实现java代码 package ccnu.offer.tree;// 平衡二叉树(AVL树)的avl实现 // AVL树只是实现平衡二叉树的一种方法,它还有很多的其他实现方法如红黑树、替罪羊树、Treap、伸展 // 树等。接着来了解一下AVL树的特性:一棵AVL树是其每个结点的左子树和右子树的高度差的绝对值不超 // 过1的二叉查找树(空树的高度为-1),这个差值也称为平

MLee的博客 1398

java2叉树算法_二叉树 & 平衡二叉树 算法(Java实现)

packagecom.demo.tree;importjava.util.LinkedList;importjava.util.Queue;public classBalancedBinaryTree {public static voidmain(String[] args){BalancedBinaryTree tree= newBalancedBinaryTree();tree.batchI...

weixin_29517217的博客 130
上一篇: 二叉查找树(java)
下一篇: JS 数组的迭代方法
^^_candice
博客等级 码龄10年 3粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值