二叉查找树(java)

Java实现二叉树(一):二叉查找树的实现 Java实现二叉树(一):二叉查找树的实现    数据结构+算法=程序,这是共识,是真理,还是学生时代卷子中的考点。但大多数程序员往往缺乏数据结构和算法的知识,或是根本没有学过,或是学过,但在工作时频繁地与业务逻辑打交道,也就逐渐忘记了有这么一回事。    话不多说,直接开始吧,本文将介绍二叉树的基本概念,以及平衡二叉树增删改查节点的实现,由于网上关于数据结构的资料,C++相对居多,而本身作为一个... 阅读详情

实现二叉查找树的查找、插入、最大值、最小值、删除

/**
 * 二叉查找树:
 * 1.若任意节点的左子树不为空,则左子树的所有的节点值均小于根节点的值;
 * 2.若任意节点的右子树不为空,则右子树上所有节点的值均大于它的根节点的值;
 * 3.任意节点的左右子树也分别为二叉查找树;
 * 4.!!!! 没有键值相等的节点;
 */

public class Binary_Search_Tree {
	
	//查找,插入、删除,最大值、最小值、删除
	
	/**
	 * 查找二叉树root中键值为key的节点
	 * 1.root == null,返回null
	 * 2.root不为null,比较root的键值和key
	 * 3.root.key > key; 在左子树中查找 --- 递归
	 * 4.root.key < key ,在右子树中查找 --- 递归
	 * 
	 */
	public static BsNode search(BsNode root, int key) {
		if (root != null) {
			if (key < root.key) {
				return search(root.left, key); // 递归查找左子树
			}else if (key > root.key) {
				return search(root.right, key);
			}else {
				return root;
			}
			
		}
		return null;
	}
	
	/**
	 * 查找二叉查找树root的最大值
	 * 1. root为null,返回null
	 * 2. root不为null:
	 * 2.1 root.right为null,返回root
	 * 2.2 root.right不为null,递归查询root的右子树
	 */
	public static BsNode searchMaxKey(BsNode root) {
		if (root != null) {
			if (root.right == null) {
				return root;
			}else {
				return searchMaxKey(root.right);
			}
		}
		
		return null;
	}
	
	/**
	 * 查找二叉查找树root的最小值
	 * 1. root为null,返回null;
	 * 2.root 不为null;
	 * 2.1 root的左子树为空,返回root
	 * 2.2 root的左子树不为空,递归查询root的左子树
	 */
	public static BsNode searchMin(BsNode root) {
		if (root != null) {
			if (root.left == null) {
				return root;
			}else {
				return searchMin(root.left);
			}
		}
		return null;
	}
	
	/**
	 * 插入节点 
	 * 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);
			}else {
				insert(root.left, data);
			}
		}else if (data > root.key) {
			if (root.right  == null) {
				root.right = new BsNode(data);
			}else {
				insert(root.right, data);
			}
		}else {
			return;
		}
		
	}
	
	/**
	 * 删除
	 * 1. 被删除节点没有子节点,即为叶子节点:直接删除,父节点对应的子节点置空
	 * 2. 被删除节点的左子树或者右子树为空,删除该节点,让其父节点关联其子节点;
	 * 3. 左右子树都不为空:把该节点的直接前驱(该节点左子树中的最大节点)或者直接后继节点(该节点右子树中的最小节点)替换该节点,删除直接前驱节点或者直接后继节点
	 * @return 返回根节点
	 */
	public static BsNode delete(BsNode root, int data) {
		if (root == null) {
			return null;
		}
		BsNode node = search(root, data);
		return deletePro(root, node);
		
	}
	public static BsNode deletePro(BsNode root,BsNode node) {
		//情况一:
		if (node.left == null && node.right == null) {
			if (node == root) {//被删除节点为根节点
				root = null;
			}else {
				if (node.parent.left == node) {
					node.parent.left = null;
				}else {
					node.parent.right = null;
				}
			}
			
		}else if (node.left == null) { //情况二
			if (node == root) { //被删除节点为根节点
				root = root.right;
				root.parent = null;
			}else {
				if (node.parent.left == node) { //该节点是其父节点的左节点
					node.parent.left = node.right;
				}else {							//该节点是其父节点的右节点
					node.parent.right = node.right;
				}
				node.right.parent = node.parent;
			}
			
		}else if (node.right == null) { //情况二
			if (node == root) { //被删除节点为根节点
				root = root.left;
				root.parent = null;
			}else {
				if (node.parent.left == node) {
					node.parent.left = node.left;
				}else {
					node.parent.right = node.left;
				}
				node.left.parent = node.parent;
			}
			
		}else { //情况三
			BsNode preNode =null;
			if (node == root) {
				preNode = searchMaxKey(root.left);// 获取前驱节点
				
				root.key = preNode.key;
				
			}else {
				preNode = searchMaxKey(node.left);// 获取前驱节点
				node.key = preNode.key;
			}
			//删除前驱节点
			deletePro(root, preNode);
			
		}
		return root;
	}
	
	/**
	 * 层次遍历
	 * 
	 */
	public static void LevelTree(BsNode root) {
		if (root == null) {
			return;
		}
		Queue<BsNode> queue = new ArrayDeque<BsNode>();
		queue.add(root);
		while(!queue.isEmpty()) {
			BsNode node = queue.poll();//获取队首元素,并从队列中删除
			System.out.println(node.key);
			if (node.left != null) {
				queue.add(node.left); //左节点入队
			}
			if (node.right != null) {
				queue.add(node.right); //右节点入队
			}
			
		}
	}
	//测试
	public static void main(String[] args) {
		//创建一颗二叉树 9(5(2,7),13(12(10),14))
		/*BsNode root = new BsNode(9);
		BsNode node1 = new BsNode(5);BsNode node2 = new BsNode(13);
		root.left = node1; root.right = node2;
		
		BsNode node1_1 = new BsNode(2); BsNode node1_2 = new BsNode(7);
		node1.left = node1_1; node1.right = node1_2;
		
		BsNode node2_1 = new BsNode(12); BsNode node2_2 = new BsNode(14);
		node2.left=node2_1; node2.right=node2_2;
		
		BsNode node2_1_1 = new BsNode(10);
		node2_1.left = node2_1_1; 
		
		
		int key = 12;
		BsNode bsNode = search(root,key);
		System.out.println("key为"+key+"节点存在否:   "+ ((bsNode !=null)?"存在":"不存在"));
		
		System.out.println("二叉树的最大key值:"+searchMaxKey(root).key);
		
		System.out.println("二叉树的最小key值:"+searchMin(root).key);
		
		insert(root, 11);
		System.out.println("插入节点后的中序遍历");
		LDR(root);*/
		
		//叶子节点
		BsNode node1 = new BsNode(6, null, null); BsNode node2 = new BsNode(8, null, null);
		BsNode node3 = new BsNode(10, null, null); BsNode node4 = new BsNode(14, null, null);
		BsNode node5 = new BsNode(7, node1, node2);
		BsNode node6 = new BsNode(12, node3, null);
		BsNode node7 = new BsNode(13, node6, node4);
		BsNode node8 = new BsNode(5, null, node5);
		BsNode root = new BsNode(9, node8, node7);
		node1.parent = node5; node2.parent = node5;
		node3.parent = node6; node4.parent = node7;
		node5.parent = node8; node6.parent = node7;
		node7.parent = root; node8.parent = root;
		
		//LevelTree(root);
		
		delete(root, 9);
		//delete(root, 13);
		//delete(root, 8);
		//delete(root, 12);
		//delete(root, 5);
		System.out.println("删除节点后");
		//LDR(root);
		LevelTree(root);
	}

}

class BsNode{
	//三叉节点
	
	int key;
	
	BsNode left;
	
	BsNode right;
	
	BsNode parent;

	public BsNode(int key, BsNode left, BsNode right, BsNode parent) {
		super();
		this.key = key;
		this.left = left;
		this.right = right;
		this.parent = parent;
	}
	public BsNode(int key, BsNode left, BsNode right) {
		super();
		this.key = key;
		this.left = left;
		this.right = right;
	}
	
	public BsNode(int key) {
		super();
		this.key = key;
	}
	
}

 

【毕设全程指导】基于YOLOv8的包装商品检测与可视化系统(SKU110K实战) 本文介绍了一个基于YOLOv8的包装商品检测与可视化系统毕业设计方案。项目采用SKU110K数据集,通过CSV转TXT格式转换适配YOLO模型训练,包含详细的环境搭建、模型配置和训练流程。系统实现了包装商品的自动化检测,并开发了Tkinter可视化界面进行交互式检测展示。该方案结合产业应用需求与技术深度,既具备实用价值,又能充分展示学生的技术能力,适合作为计算机视觉相关专业的毕业设计选题。整个项目从数据准备到界面开发完整覆盖,帮助学生系统掌握目标检测项目的完整实现流程。 阅读详情

相关推荐

近几年预训练语音大模型汇总

语音大模型研究近年来取得显著进展,主要包括wav2vec 2.0(2020)、HuBERT(2021)、WavLM(2022)、Data2Vec(2022)、Whisper(2023)等代表性工作。这些模型采用自监督学习框架,通过掩码预测、对比学习等策略在大规模语音数据上预训练,可有效应用于语音识别、情感分析、疾病检测等下游任务。其中wav2vec 2.0首次将对比学习引入语音领域,Whisper通过68万小时弱监督数据实现强大的跨语言能力。这些突破为低资源语音任务提供了通用特征提取方案,推动了医疗语音分析

victory0431的博客 1777

二叉搜索树操作详解

二叉搜索树(二叉排序树)是一种搜索结构,它通常具有一下特点: 若他的左子树不为空,则左子树上的所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树 中序遍历的结果是升序序列 下面,我讲一下二叉搜索树的基本操作方法 查找 若根节点不为空: 如果根节点key == 目标key,返回true 如果根节点key &gt;...

冷山不生云 549

避开PSRR仿真三大坑:用Cadence psspxf分析分频器时,这些设置错了白忙活

本文深入探讨了使用Cadence psspxf工具进行分频器PSRR仿真时常见的三大技术陷阱,包括扰动信号参数设置、收敛性优化和后处理信号提取。通过详细的参数推荐和实战技巧,帮助工程师避免仿真误差,提升PSRR分析效率与准确性,特别适用于16分频器等数字-模拟混合电路设计。

weixin_29258297的博客 300

二叉搜索树的操作

一、二叉搜索树的概念: 1.二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: (1)若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 (2)若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 (3)它的左右子树也分别为二叉搜索树 给定值的比较次数等于给定值节点在二叉排序树中的层数。如果二叉排序树是平衡的,则n个节点的二叉排序树的高度为Log2n+1,其查...

弯弯传奇的博客 398

jmeter问题系列:Begin size 0 is not equal to fixed size 5

Begin size 0 is not equal to fixed size 5 ,问题的解决

雨水的早晨的博客 2411

传导案例:某医疗仪器传导骚扰整改案例

紫外线光疗仪是一种专业的医疗设备,主要用于治疗银屑病、白癜风等皮肤疾病。该设备采用物理治疗技术,通过特定波长的紫外线照射人体来达到治疗效果。自1984年窄谱中波紫外线(NB-UVB)应用于临床以来,该技术已成为治疗早期蕈样肉芽肿(MF)的有效方法之一。作为二类医疗器械,紫外线光疗仪必须符合严格的电磁兼容性(EMC)标准,这不仅关系到设备自身的稳定运行,更关乎患者的使用安全和治疗效果。紫外线光疗仪传导骚扰整改案例充分展示了系统性EMC设计的重要性。

m0_56451176的博客 340

C++二叉树的实现

C++实现二叉查找树 啥是二叉查找树 在数据结构中,有一个奇葩的东西,说它奇葩,那是因为它重要,这就是树。而在树中,二叉树又是当中的贵族。二叉树的一个重要应用是它们在查找中的应用,于是就有了二叉查找树。 使二叉树成为一颗二叉查找树,需要满足以下两点: 对于树中的每个节点X,它的左子树中所有项的值都要小于X中的项; 对于树中的每个节点Y,它的右子树中所有项的值都要大于Y中的项。

ranjiewen的博客 679

lammps后处理:堆垛层错和孪晶的数量统计

python调用ovito包可以免费实现ovito pro版本的功能,不需要安装ovito pro软件,如统计位错线长度、CNA结构、键角分布等,如需深入学习,可考虑报名python ovito后处理课程,或lammps一对一课程。lammps金属变形模拟中,可能会产生堆垛层错或者孪晶等结构,但是ovito免费版本无法统计这些结构的数量。使用python和ovito软件包,则可以方便的统计出这些结构的数量。大家好,我是小马老师。

lammps_jiayou的博客 464

算法————笔试内容--->二叉搜索树

二叉搜索树: 二叉so

求知欲 567

【实验必备】对AffectNet数据集进行人脸对齐的小Demo

本文首先简单介绍了AffectNet数据集,及人脸关键点等背景知识,接着Po出了人脸对齐的代码及效果展示。注:本文代码参考自FG2021的Emotion-GCN的开源代码,具有一定的可靠性,欢迎大家学习!

信小海 2666

5、数字图像采集:X射线成像技术全解析

本文全面解析了数字图像采集中的X射线成像技术,涵盖数字X射线探测器、荧光透视与血管造影、乳腺摄影以及计算机断层扫描(CT)的图像重建原理。详细介绍了TFT平板探测器的优势、DSA技术在血管成像中的应用、乳腺摄影对高对比度和分辨率的需求,以及CT中基于Radon变换和滤波反投影的重建方法。同时探讨了噪声、部分容积效应、金属伪影和运动伪影等常见问题及其影响。最后总结了各类X射线成像技术的特点与应用场景,并展望了未来在图像质量提升和剂量优化方面的技术发展方向。

l6m7n8的博客 126

二叉查找树Java版(来自:算法)

二叉查找树 定义(来自百度百科):  二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树; (4)没有键值相等的节点。 下面代码中主要实现了求以某结点为根的子树中的结点个数,二叉查找树的查找和排序方法,二叉查找树中...

weixin_42480264的博客 1797

SPV1050低功耗微功率太阳能充电管理模块原理图设计,已量产

在物联网应用快速普及的今天,户外低功耗传感器(如土壤温湿度、环境光照、无线节点等)的供电始终是行业痛点 —— 传统锂电池不仅需要定期更换,维护成本高,还难以满足 “终身免维护” 的场景需求。为此,我们设计了一款专为 1V~3V 低电压小型太阳能板优化的微功率太阳能电源管理模块,结合 USB 备用充电路径,实现了低功耗传感器的长期自主供电。

不脱发的程序猿 443

Java-如何创建二叉查找树

这篇文章主要讲如何创建二叉查找树。如果有哪些不对的地方请指正,欢迎批评和建议。要点本文将依照一下的几点介绍 什么是二叉查找数 二叉查找树的遍历 代码例子

hit_ynsun的博客 3610

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java实现最优二叉查找树

1 问题描述 在了解最优二叉查找树之前,我们必须先了解何为二叉查找树? 引用自百度百科一段讲解: 二叉排序树(Binary ...

5756

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java 二叉查找树_数据结构:JAVA实现二叉查找树

数据结构:JAVA实现二叉查找树写在前面二叉查找树(搜索树)是一种能将链表插入的灵活性与有序数组查找的高效性结合在一起的一种数据结构。观察二叉查找树,我们发现任何一个节点大于左子节点且小于其右子节点,也就是说一个节点的左子树的所有值都小于当前节点,右子树中的所有值都大于当前节点,其中序遍历结果应该是[2,3,4,6,7,8],这是一组排序值,在一组有序值中找到一个特定值最快的方法是二分搜索,也就是...

weixin_39677027的博客 122

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

二叉查找树,Java实现

实现二叉查找树: import java.util.ArrayList; /** * 二叉查找树 * 这里使用范型实现,增加其可重用性 * @param <E> */ public class BST<E extends Comparable<E>> { //树根 public TreeNode<E> root; ...

aa792978017的博客 230

java实现二叉查找树

java实现简单的二叉查找树 [url]http://www.exceptionhelp.com/posts/566[/url]

jhyjb的博客 252

java实现二叉查找树_[Java教程]二叉查找树的java实现

[Java教程]二叉查找树的java实现02017-08-09 20:00:091 package 查找; 2 3 import edu.princeton.cs.algs4.Queue; 4 import edu.princeton.cs.algs4.StdOut; 5 6 public class BST, Value> { 7 private class Node { 8 ...

weixin_36213143的博客 154

二叉查找树的java语言实现

二叉查找树的java语言实现

m0_63873246的博客 256

Java实现二叉查找树的前中后序遍历

Java实现二叉查找树的前中后序遍历

Ganxiang 576

使用java建立二叉查找树

使用java建立二叉查找树 /** * java 建立 二叉查找树 */ public Node build(Node root,int temp) { if(root==null) { Node node = new Node(); node.data=temp; node.left=null; node.right=null; return node; } if(temp>root.data) { root.right=build(root

HappyCode 360

二叉查找树--查找、删除、插入(Java实现)

下篇:平衡二叉树                http://blog.youkuaiyun.com/kiritor/article/details/8892648         二叉查找树                  二叉查找树(Binary Search Tree),或者是一颗空树,或者是具有下列性质的二叉树:                        1、若它的左子树不空,则

LCore的专栏 3万+

【Java -- 算法】二叉查找树

二叉查找树 又称为 二叉搜索树,它是一棵空树,或者是具有下列性质的 二叉树

Kevin Learn Android 446

二叉树查找 java_Java实现二叉树(一):二叉查找树的实现

Java实现二叉树(一):二叉查找树的实现数据结构+算法=程序,这是共识,是真理,还是学生时代卷子中的考点。但大多数程序员往往缺乏数据结构和算法的知识,或是根本没有学过,或是学过,但在工作时频繁地与业务逻辑打交道,也就逐渐忘记了有这么一回事。话不多说,直接开始吧,本文将介绍二叉树的基本概念,以及平衡二叉树增删改查节点的实现,由于网上关于数据结构的资料,C++相对居多,而本身作为一个Javaer,将...

weixin_32129195的博客 602

二叉查找树的Java实现

为了克服对树结构编程的恐惧感,决心自己实现一遍二叉查找树,以便掌握关于树结构编程的一些技巧和方法。以下是基本思路:           [1] 关于容器与封装。封装,是一种非常重要的系统设计思想;无论是面向过程的函数,还是面向对象的对象,都是实现抽象和封装的技术手段。要使系统更加安全更具可维护性,就应当将封装思想谨记心中。容器是封装思想的绝好示例。用户对容器的印象应该简洁地表达为:A. 可以存

瀞心:软件人生 5673
上一篇: 数据结构之二叉树(Java)
下一篇: 平衡二叉树的插入操作(java)
^^_candice
博客等级 码龄10年 3粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值