数据结构之二叉排序树或者二叉查找树(java版)

Opus Clip AI技术浅析(一) Opus Clip AI 是一款由Opus公司推出的AI视频剪辑工具,旨在通过人工智能技术简化视频编辑过程,帮助用户快速从长视频中提取精彩片段,并生成适合社交媒体分享的短视频。 阅读详情
package com.test;

import java.util.Scanner;

public class TestBintree {

	public static void main(String[] args) {

		Scanner scan = new Scanner(System.in);

		int x = scan.nextInt();
		TreeNode head = new TreeNode(x, 1, null);      //输入一个整数 ,构造第一个结点

		while (scan.hasNext()) {
			int n = scan.nextInt();
			if (n == -1) {
				System.out.println("二叉排序树创建完成");
				break;
			} else {
				create(head, n);
			}
		}

		preOrder(head);

		delete(head, 10);
		
		System.out.println();
		
		preOrder(head);
		
		
		
	}

	public static void create(TreeNode head, int n) {    // 创建二叉查找树(二叉排序树)
		int id = head.getId();
		if(n == id) {
			System.out.println("创建的值已经存在");
			return;
		}
		if (n < id) {
			if (head.getLchild() == null) {
				head.setLchild(new TreeNode(n, 2 * head.getNum(), head));
				return;
			} else {
				create(head.getLchild(), n);
			}
		} else {
			if (head.getRchild() == null) {
				head.setRchild(new TreeNode(n, 2 * head.getNum() + 1, head));
				return;
			} else {
				create(head.getRchild(), n);
			}
		}
	}

	public static void preOrder(TreeNode head) {         // 中序遍历二叉树
		if (head == null) {
			return;
		} else {
			preOrder(head.getLchild());
			System.out.print(head.getId() + ":" + head.getNum() + " ");
			preOrder(head.getRchild());
		}
	}

	public static void delete(TreeNode head, int id) {   // 删除某个节点

		while (true) {                                   //查找要删除的结点所在的位置
			if (id == head.getId()) {
				break;
			}
			if (id < head.getId()) {
				head = head.getLchild();
				if (head == null) {
					System.out.println("所要删除的结点不存在");
					return;
				}
			} else {
				head = head.getRchild();
				if (head == null) {
					System.out.println("所要删除的结点不存在");
					return;
				}
			}
		}

		TreeNode lchild = head.getLchild();
		TreeNode rchild = head.getRchild();
		TreeNode father = head.getFather();
		int num = head.getNum();

		if (num % 2 == 0) {	                                    //要删除的结点是左孩子
			if (lchild == null && rchild == null) {             //要删除的结点是叶子结点
				father.setLchild(null);
				head = null;
			} else {
				if (lchild != null && rchild == null) {         //要删除的结点是只有左孩子
					lchild.setNum(num);
					father.setLchild(lchild);
					head = null;
				} else {
					if (lchild == null && rchild != null) {     //要删除的结点只有右孩子
						rchild.setNum(num);
						father.setLchild(rchild);
						head = null;
					} else {
						head.setId(lchild.getId());            //要删除的结点既有左孩子,也有右孩子
						head.setLchild(lchild.getLchild());

						if (lchild.getRchild() != null) {
							if (rchild.getLchild() != null) {
								while (rchild.getLchild() != null) {
									rchild = rchild.getLchild();
								}
							}

							lchild.getRchild().setNum(num + 1);
							rchild.setLchild(lchild.getRchild());
						}

						lchild.setRchild(null);
						lchild.setLchild(null);
						lchild = null;
					}
				}
			}
		} else {                                                  //要删除的结点是右孩子
			if (lchild == null && rchild == null) {				  //要删除的结点是叶子结点
				father.setRchild(null);
				head = null;
			} else {
				if (lchild != null && rchild == null) {           //要删除的结点是只有左孩子
					lchild.setNum(num);
					father.setRchild(lchild);
					head = null;
				} else {
					if (lchild == null && rchild != null) {      //要删除的结点只有右孩子
						rchild.setNum(num);
						father.setRchild(rchild);
						head = null;
					} else {                                     //要删除的结点既有左孩子,也有右孩子
						head.setId(rchild.getId());
						head.setRchild(rchild.getRchild());

						if (rchild.getLchild() != null) {
							if (lchild.getRchild() != null) {
								while (lchild.getRchild() != null) {
									lchild = lchild.getRchild();
								}
							}
							rchild.getLchild().setNum(num - 1);
							lchild.setRchild(rchild.getLchild());
						}

						rchild.setRchild(null);
						rchild.setLchild(null);
						rchild = null;
					}
				}
			}
		}
	}
	
	public static boolean find(TreeNode head, int id) {  //查找某个结点,存在返回true,否则返回false
		while (true) {
			if (id == head.getId()) {
				return true;
			}
			if (id < head.getId()) {
				head = head.getLchild();
				if (head == null) {
					return false;
				}
			} else {
				head = head.getRchild();
				if (head == null) {
					return false;
				}
			}
		}
	}
	
}

class TreeNode {       //结点的结构

	private int id;
	private int num;
	private TreeNode lchild;
	private TreeNode rchild;
	private TreeNode father;

	public TreeNode(int id, int num, TreeNode father) {
		this.id = id;
		this.num = num;
		this.father = father;
	}

	public TreeNode getFather() {
		return father;
	}

	public void setFather(TreeNode father) {
		this.father = father;
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public TreeNode getLchild() {
		return lchild;
	}

	public void setLchild(TreeNode lchild) {
		this.lchild = lchild;
	}

	public TreeNode getRchild() {
		return rchild;
	}

	public void setRchild(TreeNode rchild) {
		this.rchild = rchild;
	}

}


 

利用autojs制作抢购支付宝消费劵的手机脚本 前期准备工作 1.打开支付宝,点击中间的抢消费券的广告 2.点击左上角,将抢购页面添加到首页 3.查看支付宝首页是否出现消费劵 . autojs代码 "auto"; functiontaskstart(){ sleep(1000); launchApp('支付宝'); toast("正在打开支付宝应用"); sleep(1000); varxf=textContains("消费").findOne().bounds(); ... 阅读详情

相关推荐

RDMA性能调优实战:如何用ib_*命令榨干你的Mellanox网卡带宽?

本文深入探讨了如何利用ib_*命令工具集对RDMA网络进行深度性能调优,以充分释放Mellanox网卡的带宽潜力。文章从理解Send/Write/Read三种核心通信原语的差异入手,逐步指导读者通过调整消息大小、队列深度、内联数据等关键参数,并结合系统级的NUMA绑定、中断亲和性等优化策略,实现从基准测试到逼近硬件极限的性能提升。

weixin_29306011的博客 88

二叉树:实现java操作二叉排序树(生成、插入、遍历、删除)

首先来了解一下二叉排序树的由来,也就是在什么情况下迫使老一辈头脑风暴的科学家发明使用这种方法。 先说普通顺序存储(注意并不是有序),先来先坐,有点类似于“栈”。插入数据直接放到最末尾,删除中间数据的话可以把待删除数据和最后一位数据进行互换,也可以把待删除数据后的全部数据统一往前挪一位。这里实在没有顺序的前提下,删除和插入的效率都没有毛病,但是查找就有点差强人意了,或者说效果很悲观。 那么对于有

Somhu的博客 2673

STM32开发实战:从嵌入式系统到硬件控制 | 你必须得会

🏆本文收录于「编程与技术实战」专栏,此专栏涵盖了C/C++编程、人工智能、数据结构、机器学习等技术领域的内容,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 1046

“数据结构”课程设计题目

“数据结构”课程设计题目 1、城市链表 [问题描述] 将若干城市的信息,存入一个带头结点的单链表。结点中的城市信息包括:城市名,城市的位置坐标。要求能够利用城市名和位置坐标进行有关查找、插入、删除、更新等操作。 [基本要求] (1) 给定一个城市名,返回其位置坐标; (2) 给定一个位置坐标P和一个距离D,返回所有与P的距离小于等于D的城市。 [测试数据] 由学生依据软件工程的测试

dkh_321的博客 2万+

机械工程师如何用Codex实现CAD自动化:从重复劳动到智能设计

在机械设计领域,CAD二次开发长期面临学习门槛高、维护成本大的难题。随着AI编程助手如Codex的出现,通过自然语言生成可执行代码,工程师无需精通编程即可实现图纸批量处理、BOM表自动生成、参数化建模等任务。这种技术将重复性操作自动化,显著提升设计效率,让工程师聚焦于核心创新。应用场景涵盖批量修改图纸属性、跨软件数据流转、自动打印等。本文分享机械工程师利用Codex落地自动化的实战经验与避坑指南。

weixin_32296621的博客 363

Ubuntu中snap简单介绍

通过Snap可以安装众多的软件包。需要注意的是,snap是一种全新的软件包管理方式,它类似一个容器拥有一个应用程序所有的文件和库,各个应用程序之间完全独立。所以使用snap包的好处就是它解决了应用程序之间的依赖问题,使应用程序之间更容易管理。但是由此带来的问题就是它占用更多的磁盘空间 介绍一些常用命令,有点类似docker 1、查看已经通过snap安装的snap包 snap list可以查看 2、可以搜索想要的snap包,例如tomcat snap search tomcat

icanflying的博客 4万+

数据结构树-->二叉查找树\二叉排序树

二叉查找树\二叉排序树 二叉查找树是一种有序的二叉树,也叫儿叉排序树,它在二叉树的基础上添加了位置排序的规则。 规则: 每颗子树的根节点值比左子树大,比右子树小。 二叉查找树的缺点: 二叉查找树有了排序,但当我们的数据顺序与大小规律一致是就会发现,二叉查找树基本退化为了链表,导致达不到二叉 查找树快速查找的目的。 后续我们在介绍平衡二叉树的时候会解决之一问题。 1. 二叉查找树的查找 更具儿叉查找树的特性二叉查找树查找元素快速简单,快速:二叉查找树查找基本就是二分查找,所以快速。 2. 二叉查找树的插入

路漫漫其修远兮 2621

【事件相机实战】噪声识别与智能滤波技术解析

本文深入解析了事件相机应用中关键的噪声识别与智能滤波技术。针对背景活动噪声、阈值波动噪声、热点噪声及运动边缘尾迹等核心噪声类型,文章剖析了其成因与特征,并详细介绍了从经典的时空相关性滤波、热点像素滤除到前沿的深度学习(如EDnCNN)等实战滤波方法,旨在帮助开发者在保证低延迟的前提下,有效提升事件流数据质量。

weixin_29169899的博客 440

数据结构之二叉查找树Java泛型版

二叉查找树是父节点的权值比其左子树的权值大又比其右子树的权值小的二叉树。二叉查找树可递归生成,并且每一颗小子树都是二叉查找树。根据二叉查找树的特点对其进行中序遍历会得到一串有序的序列,故又称二叉查找树为二叉排序树。二叉查找树的查找发挥了二叉树的二叉的优势,并且二叉查找树适合对原序列进行插入和删除操作,原始的二分查找是在数组中进行查找操作不适合进行插入和删除操作。

Cukor丘克的博客 816

【DaVinci Developer专题】-23-IDT高阶应用:结构体类型的数组

共8页 目录 1 创建一个Record IDT 2 创建一个Array IDT 3 创建一个S/R Port Interface 4 创建一个Constant 5 导入CFG生成代码的总结 6 结尾 <--返回「实战篇」博文-总目录--> <--返回「Autosar从入门到精通-实战篇」专栏主页--> 关键字: 缩略语/术语 含义 DEV DaVinci Developer .

「汽车电子助手」的博客 1670

QT-Creator安装教程(windows)

本文介绍了Qt的下载安装步骤:1)通过镜像源下载安装包;2)运行exe文件时使用命令行参数指定镜像地址;3)在安装过程中选择路径和自定义安装组件,包含QT5和QT6版本的详细安装说明;4)安装后可继续添加扩展包或卸载组件。重点提示了QT6必须勾选的关键组件,并提供了组件管理的操作方法。

qq_53545309的博客 3110

基本数据结构之二叉排序树(用Java语言实现)

二叉排序树 二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree)或二叉搜索树。二叉排序树为满足以下条件的树: ◎ 若左子树不空,则左子树上所有节点的值均小于它的根节点的值; ◎ 若右子树不空,则右子树上所有节点的值均大于或等于它的根节点的值; ◎ 左、右子树也分别为二叉排序树。如图4-10所示便是一个二叉排序树。 插入操作 在二叉排序树中进行插入操作时只需找到待插入的父节点,将数据插入即可,具体流程如下。 (1)将待插入的新节点与当前节点进行比较,如果两个

qq_44182694的博客 1915

【AI智能体】全场景AI智能体工作台WorkBuddy实战操作详解

全场景AI智能体工作台WorkBuddy实战操作详解

congge 5535

数据结构之二叉排序树

二叉排序树 二叉查找树是二叉树中最常用的一种类型,也叫二叉排序树。顾名思义,二叉查找树是为了实现快速查找而生的。不过,它不仅仅支持快速查找一个数据,还支持快速插入、删除一个数据 二叉排序树:BST: (Binary Sort(Search) Tree), 对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。 如果有相同的值,可以将该节点放在左子节点或右子节点 二叉排序树的插入 新插入的数据一般都是在叶子节点上,所以我们只需要从根节点开始,依次比较要插入的数据和

weixin_49561445的博客 333

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

数据结构—二叉排序树的原理以及Java代码的完全实现

本文详细介绍了二叉排序树的原理,并且提供了Java代码的完全实现。二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。

终生学习践行者 3998

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

二叉查找树(二叉搜索树,二叉排序树)

二叉查找树 记录自己的学习过程,如果其中有什么错误欢迎各位大佬指正。 二叉查找树,又叫二叉搜索树,二叉排序树。他是一种特殊的二叉树,为提高查找效率而诞生的数据结构。 二叉查找树的特征 (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉查找树; (4)没有键值相等的结点。 二叉查找树种的查找 由于二叉查找树的特性左子树上的节点永远小于根节点,右子树的节点永远大于根节点,那么在找寻一个节点的时候可

qq_40083538的博客 1313

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java实现构造二叉排序树

文章目录定义特点实现思想实现细节整体代码实现测试 上一篇讲到了二叉树的构建以及遍历方式有广度遍历以深度遍历,深度遍历又包括先序遍历、中序遍历以及后序遍历… ☞上一篇链接 这篇主要来介绍什么是二叉排序树,以及如何构建二叉排序树 定义 二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。是数据结构中的一类。在一般情况下,查询效率比链表结构要高。 特点 这棵二叉树的特点是: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

you do ,you win 1299

数据结构(Java实现)-图解二叉排序树(二叉查找树、二叉搜索树)

二叉排序树 1、二叉排序树的介绍

jQueryZK的博客 2299

二叉排序树的理解和实现(Java)

二叉排序树的定义和性质 二叉排序树又称二叉排序树。它或者是一个空树,或者是一个具有下列性质的二叉树: 若它的左子树不空,则左子树上所有节点的值均小于它的根结构的值 若它的右子树不空,则右子树上所有结点的值均大于它的根节点的值 它的左、右子树也分别是二叉排序树 如下图是一个二叉排序树: 下面的代码(Java实现)基本全部基于递归实现(非递归操作复杂且效率高),简单的实现了BST的这些操作:初始...

如是说的博客 9223

数据结构-二叉排序树(Java实现)

数据结构-二叉排序树(Java实现)二叉排序树代码实现结点定义合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 二叉排序树 二叉排...

零点悟的博客 515

数据结构之二叉排序树BST/二叉查找树/二叉搜索树的创建与删除(动画示例)(非递归)(Java)

数据结构之二叉排序树BST/二叉查找树/二叉搜索树的创建与删除(动画示例)(非递归)(Java)

H_X_P_的博客 784

【Java数据结构】二叉排序树

二叉排序树为什么需要二叉排序树?什么是二叉排序树(BST)? 为什么需要二叉排序树? 假设有一组数字,{7,3,10,12,5,1,9},面对这么一组数字,我们有很多种方式来存储他们。 例如线性结构中不排序的顺序存储结构: 对这种数据结构来说,它查找某个元素十分的困难,需要从头到尾挨个去寻找。 线性结构中排序的顺序存储结构: 哪怕是排序过后的该种数据结构,通过二分查找,它的查找效率会变高,但是...

萌宅鹿的技术小屋 669

Java实现数据结构之二叉查找树

一、综述       二叉查找树或者是一棵空树,或者是具有下列性质的二叉树:               (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;               (2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;               (3)左、右子树也分别为二叉排序树;               (4)没有键值相等的节点

山中小僧的进阶之路 781

数据结构之二叉排序树的创建和删除(java)

一、二叉排序树的定义   二叉排序树(也称二叉查找树)或者是一棵空树,或者是具有下列特性的二叉树:   1)若左子树非空,则左子树上所有结点的值均小于根结点的值。   2)若右子树非空,则右子树上所有结点的值均大于根结点的值。   3)左、右子树也分别是一棵二叉排序树。   根据二叉排序树的定义,左子树结点值<根结点值<右子树结点值,所以对二叉排序树进行中序遍历,可以得到一个递增的有序序列。 二、二叉排序树的查找   二叉排序树的查找是从根结点开始,沿某个分支逐层向下比较的过程。若二叉排序

weixin_43698993的博客 1061

数据结构查找算法之二叉查找树(二叉排序树)【附Java代码实现,图解】

基本思想:二叉查找树是先对待查找的数据进行生成树,确保树的左分支的值小于右分支的值,然后在就行和每个节点的父节点比较大小,查找最适合的范围。 这个算法的查找效率很高,但是如果使用这种查找方法要首先创建树。 二叉查找树或者是空树,或者是具有以下特征: 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 任意节点的左、右子树也分别为二叉查找树。 复杂度分析:它和二分查找一样,插入和查找的时间复杂度均为O(l

ppBlog 1549

Java实现二叉查找树及其相关操作

目录 二叉查找树 初始化 二叉查找树的查找 二叉查找树的插入 二叉查找树的删除 二叉查找树的中序遍历 findMax and findMin 二叉查找树完整代码 测试用例 完整代码已上传至gitee中:gitee代码仓库 二叉查找树 二叉查找树,又称二叉排序树,亦称二叉搜索树,是数据结构中的一类。在一般情况下,查找效率比链表结构要高。 二叉查找树的定义: 一棵空树或具有如下性质的树: ①若左子树不为空,则左子树上所有结点的值小于根结点的值; ②若右子树不...

qq_58284486的博客 1818
上一篇: poj 1207(拓扑排序用到了深搜)
下一篇: 快速排序
三易的博客
博客等级 码龄15年 42粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值