JAVA之查找二叉树ADT

整数列表与数组ADT设计 本文定义了整数列表和二维数组的抽象数据类型(ADT),并通过Java抽象类展示其核心操作。针对稀疏矩阵场景,提出了三元组和链表两种节省空间的实现方式,并讨论了ADT与数据结构的关系及其在实际应用中的意义。 阅读详情

查找二叉树ADT:性质:对于树中每个节点X,它的左子树所有项的值小于X中的项而它的右子树所有项的值大于X中的项

/*
 * 查找二叉树ADT:
 * 性质:对于树中每个节点X,它的左子树所有项的值小于X中的项
 * 	而它的右子树所有项的值大于X中的项
 */
public class BinarySearchTree<AnyType extends Comparable<? super AnyType>> {
	/*
	 * 树节点元素
	 */
	private static class BinaryNode<AnyType>{
		AnyType element;	//The data in the node(数据)
		BinaryNode<AnyType> left;	//lefi Child(左孩子:必须要比祖先节点小)
		BinaryNode<AnyType> right;	//right Child(右孩子:必须要比祖先节点大)
		public BinaryNode(AnyType theElement){
			this(theElement, null, null);
		}
		public BinaryNode(AnyType theElement, BinaryNode<AnyType> lt, BinaryNode<AnyType> rt){
			element = theElement;
			left = lt;
			right = rt;
		}
	}
	
	private BinaryNode<AnyType> root;	//根节点
	
	public boolean isEmpty(){
		return root == null;
	}
	
	public BinarySearchTree(){
		root = null;
	}
	
	public void makeEmpty(){
		root = null;
	}
	
	public boolean contains(AnyType x){
		return contains(x, root);
	}
	
	/*
	 * 利用递归的思想来递归调用
	 */
	private boolean contains(AnyType x, BinaryNode<AnyType> t){
		if(t == null)
			return false;
		int compareResult = x.compareTo(t.element);
		
		if(compareResult < 0)
			return contains(x, t.left);
		else if(compareResult > 0)
			return contains(x, t.right);
		else
			return true;
	}
	
	/*
	 * 取树中的最小值
	 */
	public AnyType findMin(){
		if(isEmpty())
			throw new NullPointerException();
		return findMin(root).element;
	}
	
	private BinaryNode<AnyType> findMin(BinaryNode<AnyType> t){
		if(t == null)
			return null;
		else if(t.left == null)
			return t;
		return(findMin(t.left));
	}
	/*
	 * 取树中的最大值
	 */
	public AnyType findMax(){
		if(isEmpty())
			throw new NullPointerException();
		return findMax(root).element;
	}
	
	private BinaryNode<AnyType> findMax(BinaryNode<AnyType> t){
		if(t == null)
			return null;
		else if(t.right == null)
			return t;
		return findMax(t.right);
	}
	
	/*
	 * 插入数据
	 */
	public void insert(AnyType x){
		root = insert(x, root);
	}
	
	private BinaryNode<AnyType> insert(AnyType x, BinaryNode<AnyType> t){
		if(t == null)
			return new BinaryNode<>(x, null, null);
		
		int compareResult = x.compareTo(t.element);
		
		if(compareResult < 0)
			t.left = insert(x, t.left);
		if(compareResult > 0)
			t.right = insert(x, t.right);
		else
			;
			return t;
	}
	
	/*
	 * 删除节点
	 */
	public void remove(AnyType x){
		root = remove(x, root);
	}
	private BinaryNode<AnyType> remove(AnyType x, BinaryNode<AnyType> t){
		if(t == null)
			return t;
		
		int compareResult = x.compareTo(t.element);
		
		if(compareResult < 0)
			t.left = remove(x, t.left);
		else if(compareResult > 0)
			t.right = remove(x, t.right);
		else if(t.left != null && t.right != null){
			t.element = findMin(t.right).element;
			t.right = remove(t.element, t.right);
		}else
			t = (t.left != null)? t.left : t.right;
		return t;
	}
	
	public void printTree(){
		if(isEmpty())
			System.out.println("空树");
		else
			printTree(root);
	}
	
	private void printTree(BinaryNode<AnyType> t){
		if(t != null){
			printTree(t.left);
			System.out.print(t.element+" ");
			printTree(t.right);
		}
	}
	
/*
 *		测试代码
*/
	public static void main(String[] args){
		BinarySearchTree<Integer> bst = new BinarySearchTree<>();
		bst.insert(6);
		bst.insert(2);
		bst.insert(8);
		bst.insert(1);
		bst.insert(4);
		bst.insert(3);
		bst.printTree();
		System.out.println("最小值:" + bst.findMin());
	}
}


二叉树节点ADT接口(Java算法源码) /* * 二叉树节点ADT接口 */ package dsa; public interface BinTreePosition extends Position { //判断是否有父亲(为使代码描述简洁) public boolean hasParent(); //返回当前节点的父节点 public BinTreePosition getParent(); //设置当前节点的父节点 public void setParent(BinTreePosition p); //判断是否为叶子 public boolean isLeaf(); //判断是否为左孩子(为使代码描述简洁) public boolean isLChild(); //判断是否有左孩子(为使代码描述简洁) public boolean hasLChild(); //返回当前节点的左孩子 public BinTreePosition getLChild(); //设置当前节点的左孩子(注意:this.lChild和c.parent都不一定为空) public void setLChild(BinTreePosition c); //判断是否为右孩子(为使代码描述简洁) public boolean isRChild(); //判断是否有右孩子(为使代码描述简洁) public boolean hasRChild(); //返回当前节点的右孩子 public BinTreePosition getRChild(); //设置当前节点的右孩子(注意:this.rChild和c.parent都不一定为空) public void setRChild(BinTreePosition c); //返回当前节点后代元素的数目 public int getSize(); //在孩子发生变化后,更新当前节点及其祖先的规模 public void updateSize(); //返回当前节点的高度 public int getHeight(); //在孩子发生变化后,更新当前节点及其祖先的高度 public void updateHeight(); //返回当前节点的深度 public int getDepth(); //在父亲发生变化后,更新当前节点及其后代的深度 public void updateDepth(); //按照中序遍历的次序,找到当前节点的直接前驱 public BinTreePosition getPrev(); //按照中序遍历的次序,找到当前节点的直接后继 public BinTreePosition getSucc(); //断绝当前节点与其父亲的父子关系 //返回当前节点 public BinTreePosition secede(); //将节点c作为当前节点的左孩子 public BinTreePosition attachL(BinTreePosition c); //将节点c作为当前节点的右孩子 public BinTreePosition attachR(BinTreePosition c); //前序遍历 public Iterator elementsPreorder(); //中序遍历 public Iterator elementsInorder(); //后序遍历 public Iterator elementsPostorder(); //层次遍历 public Iterator elementsLevelorder(); } 立即下载

相关推荐

Java实现二叉树的基本操作

Java实现二叉树的基本操作

java实现简单的二叉树ADT

边分析边走 首先节点类: /* * 节点 * value 储存的值 * left 左节点 right 右节点 */ public class node {//结点 public int value; public node left; public node right; public node() { } public node(int value) { th...

bigsai 3520

Win11下WSL2安装Ubuntu22.04避坑指南:从镜像源到C++环境配置

本文提供了一份详细的Win11下WSL2安装Ubuntu22.04的实战避坑指南。内容涵盖从WSL2核心安装、自定义安装路径,到更换国内镜像源以解决更新缓慢问题,并一站式配置完整的C++开发环境(包括GCC、CMake、vcpkg等),最后分享提升开发体验的进阶技巧,助你在Windows上打造高效的Linux开发工作站。

weixin_29260291的博客 562

Rhyme/查找树ADT-二叉查找树的简单模拟Java版

查找树ADT-二叉查找树的简单模拟Java版 package my.binary.search.tree; /** * 查找树 ADT 二叉查找树的实现 * 假设元素类型为Integer * * @author RhymeChiang * @date 2018/01/17 **/ public class BinarySearchTreeT extends Comparablesu

RhymeChiang 405

达梦的自定义类型和存储过程支持创建同义词,不支持同义词使用?

达梦8的自定义类型和存储过程支持创建同义词,但是通过同义词调用报错,而在oracle上验证没有问题,难道是发现了达梦的bug了?非也非也,详情请见下文

wy071218的专栏 979

QGroundControl高级配置与自定义功能实战指南

本文深入探讨了QGroundControl(QGC)的高级配置与自定义功能,为无人机开发者、系统集成商和高级用户提供实战指南。内容涵盖从品牌界面定制、自定义MAVLink消息处理,到插件开发与自动化部署的全流程,旨在帮助用户解锁QGC的隐藏潜力,打造专属的行业解决方案。

weixin_29234509的博客 239

树ADT

前言   本文在完成过程中,得到许多朋友的帮助,在此谢谢诸位。本人欢乐无限,技术有限,如有任何问题,欢迎各位不吝赐教。1 树ADT  和线性表一样,树的数据对象D是具有相同特性的数据元素的集合。D中元素的个数记作n。   树和其它数据结构的主要不同体现在的元素之间的数据关系方面,而且树是一种非线性结构。树的数据关系可以递归的描述为:若数据对象集合D为空集,则称为空树;否则在D中存在唯一的称为根的

与狼同行 2776

STM32学习笔记 二、基于STM32F103C8T6和STM32CubeMX实现UART串口通信数据收发

系列文章目录 一、基于STM32F103C8T6最小系统板和STM32CubeMX实现LED灯循环闪烁 文章目录系列文章目录前言一、配置CubeMX二、逻辑代码部分 前言 这次我用的板子是一个用STM32F103C8T6作为主控芯片的一个数据采集卡,两个LED灯连接的引脚是PB3与PB4,TX与RX引脚分别是PA9和PA10。 一、配置CubeMX 1、新建工程; 2、配置时钟源,在RCC里面的HSE配置的是晶振时钟; 3、配置程序烧录引脚SYS为SWD模式; 4、配置GPIO口,配置一个LE

遗忘丶的博客 1万+

用java实现一颗平衡二叉树ADT

平衡二叉树是一颗能够确保能在O(lgn)渐进时间界进行查找的树。我编写一个类来对平衡二叉树进行操作,包括,添加元素,删除元素,查找元素等操作。我建议:对于数据结构,如果都能够自己编写一遍,不仅能够摸清其中的奥妙,而且可以快速入手其他结构。 简单实现代码如下:可以直接复制使用,或者转为自己的jar文件 package Com.Tree; import java.util.Comparator;

仙路看近行远 596

染色体外环状DNA:肿瘤研究新方向

染色体外环状DNA(ecDNA)是癌症中活化原癌基因扩增的主要方式。区别于常染色体,这类生物大分子主要以环状的形式存在于细胞核当中,长度分布在103-106数量级,无中心粒。ecDNA序列中包含一个或者多个基因与调控元件,结构开放,转录活性强,相比于在棒状染色体结构基因,ecDNA的生物功能活性更强。癌症中,成环的基因区域拷贝数往往增高,而超过一半的高拷贝数事件是ecDNA驱动生成。...

blackjimmy的博客 765

【机器学习】实验3,贝叶斯垃圾邮件识别(完整代码实现+报告)

电子邮件是互联网的一项重要服务,在大家的学习、工作和生活中会广泛使用。但是大家的邮箱常常被各种各样的垃圾邮件填充了。有统计显示,每天互联网上产生的垃圾邮件有几百亿近千亿的量级。因此,对电子邮件服务提供商来说,垃圾邮件过滤是一项重要功能。而朴素贝叶斯算法在垃圾邮件识别任务上一直表现非常好,至今仍然有很多系统在使用朴素贝叶斯算法作为基本的垃圾邮件识别算法。本次实验数据集来自的中文垃圾邮件数据集,目录解压后包含三个文件夹,其中data目录下是所有的邮件(未分词),已分词好的邮件在data_cut目录下。

高丽大学人工智能硕士在读|专注大模型、RAG、OCR与AI工程实践 5025

《Data Structures and Algorithm Analysis in Java》Second Edition中文版笔记

第3章 表、栈和队列 3.2 表ADT 3.2.2 简单链表 在表的前端添加项或删除第一项的特殊情形此时也属于常数时间的操作,当然要假设到链表前端的链是存在的。只要我们拥有到链表最后节点的链,那么在链表末尾进行添加操作的特殊情形(即让新的项成为最后一项)可以花费常数时间。因此,典型的链表拥有到该表两端的链。 保留指向最后节点的节点的第3个链的想法行不通,因为它在删除操作期间也需要更

陀思妥耶夫斯基和海德格尔伴我勇敢存在 2289

原理和代码解读:用Diffusion Models高清图像修复(Image Inpainting)

在最近的Diffusion Models应用中,Image Inpainting+ControlNet/Lora等工作在模特衣服生成、家居场景重建等场景中得到了广泛的应用。这篇博客主要介绍Diffusion Models如何在修复高清图像的。

沉迷单车的追风少年 2496

java怎么写ADT

一个ADT是一个仅由保存的数据类型和可能在这个数据类型上进行的操作定义的。开发者们只能通过ADT的操作方法来访问ADT的属性,而且他们不会知道这个数据类型内部各种操作是如何实现的。 抽象数据类型 public class ADTtest <L>{ public L name; public ADTtest(L g){ name = g; }...

ation_work的专栏 1085

YOLO11-pose关键点检测:训练实战篇 | 自己数据集从labelme标注到生成yolo格式的关键点数据以及训练教程

通过本教程,我们完整地学习了如何使用YOLO11-pose进行关键点检测任务的训练。从数据标注、格式转换到模型训练和评估,每个步骤都提供了详细的代码和说明。更高的精度:随着算法改进,关键点检测的精度将进一步提高实时性能:模型优化将使实时高性能关键点检测成为可能多模态融合:结合深度信息、热成像等多模态数据提升检测能力领域自适应:模型能够更好地适应不同场景和领域希望本教程能够帮助你在自己的项目中成功应用YOLO11-pose进行关键点检测。如果你有任何问题或建议,欢迎在评论区留言讨论!

QQ_778132974的博客 739

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java实现二叉树

二叉树的定义 树(tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的树。 二叉树是一种特殊的树,每个节点最多只能有两个子节点。(如图1.1) 二叉搜索树要求:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的...

oneTreeTallTall 2万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java 数组构建二叉树

二叉树ADT(abstract data type): 二叉树节点类: class TreeNode{ int value; TreeNode left; TreeNode right; public TreeNode(int paraValue) { this.value = paraValue; } } 二叉树类: public cl

wwHRestarting的博客 7216

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java广联达元素平衡_用java實現一顆平衡二叉樹ADT

平衡二叉樹是一顆能夠確保能在O(lgn)漸進時間界進行查找的樹。我編寫一個類來對平衡二叉樹進行操作,包括,添加元素,刪除元素,查找元素等操作。我建議:對於數據結構,如果都能夠自己編寫一遍,不僅能夠摸清其中的奧妙,而且可以快速入手其他結構。簡單實現代碼如下:可以直接復制使用,或者轉為自己的jar文件package Com.Tree;import java.util.Comparator;/*** 注...

weixin_30082367的博客 165

Java数据结构--二叉树

树 树(tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 ①、节点:上图的圆圈,比如A,B,C等都是表示节点。节点一般代表一些实体,在java面向对象编程中,节点一般代表对象。 ②、边:连接节点的线称为边,边表示节点的关联关系。一般从一个节点到另一个节点的唯一方法就是沿着一条顺着有边的道路前进。在Java当中通常表示引用。 树

qq_45657986的博客 182

查找树ADT之二叉查找树

基本的二叉查找树

枫子幽梦的博客 309

c++创建二叉树_Java 数据结构 - 树与二叉树(一)

Source from Data Structures and Algorithms in Java, 6th Edition​learning.oreilly.com我们定义一个tree的ADT将使用position来表达树中的节点。每个元素都在一个Position中存储。 注意position都需要遵守树结构中的parent-child关系。一个树结构中的position应该支持以下方法:同时...

weixin_39596835的博客 164

java数据结构与算法:二叉树

二叉树是树这种数据结构的一员,后面我们还会介绍红黑树,2-3-4树等数据结构。那么为什么要使用树?它有什么优点?前面我们介绍数组的数据结构,我们知道对于有序数组,查找很快,并介绍可以通过二分法查找,但是想要在有序数组中插入一个数据项,就必须先找到插入数据项的位置,然后将所有插入位置后面的数据项全部向后移动一位,来给新数据腾出空间,平均来讲要移动N/2次,这是很费时的。同理,删除数据也是。

weixin_74149684的博客 628

数据结构二叉树的算法 java_Java数据结构和算法(十):二叉树

一、简介二叉树是树这种数据结构的一员,后面我们还会介绍红黑树,2-3-4树等数据结构。那么为什么要使用树?它有什么优点?前面我们介绍数组的数据结构,我们知道对于有序数组,查找很快,并介绍可以通过二分法查找,但是想要在有序数组中插入一个数据项,就必须先找到插入数据项的位置,然后将所有插入位置后面的数据项全部向后移动一位,来给新数据腾出空间,平均来讲要移动N/2次,这是很费时的。同理,删除数据也是。然...

weixin_39730263的博客 264

复旦大学961-数据结构-第三章-查找(4)平衡树(AVL)的定义,性质,ADT及其实现,平衡树查找,插入算法,平衡因子的概念

平衡二叉树(AVL)的定义 在上一节中,提到了BST(二叉排序树),它的最坏查找时间复杂度为O(n)。若插入顺序是有序的,就会产生这种现象。为了解决这个问题,所以引出了平衡树。平衡树也是一棵BST,只不过它有更多的约束条件。即每个节点的左右子树的高度不能差太多。 即一棵二叉排序树,若该树的所有节点的左子树和右子树的高度之差不超过1,则该树称为平衡二叉树,简称平衡树,又称AVL树(AVL是发明人名字的字母缩写),也称BT(Balanced Binary Tree)。 其中左右子树的高度之差称为平衡因子。 在平

iioSnail的博客 517

Java学数据结构(2)——树Tree &amp; 二叉树binary tree &amp; 二叉查找树 &amp; AVL树 &amp; 树的遍历_java binarysearchtree

对于大量的输入数据,链表的线性访问时间太慢,不宜使用。本章讨论一种简单的数据结构,其大部分操作的运行时间平均为O(logN)。这种数据结构叫作二叉查找树(binary search tree)。二又查找树是两种库集合类TreeSet和TreeMap实现的基础,它们用于许多应用之中。在计算机科学中树(tree)是非常有用的抽象概念,因此,我们将讨论树在其他更一般的应用中的使用。看到树是如何用于实现几个流行的操作系统中的文件系统的。看到树如何能够用来计算算术表达式的值。

2401_89317663的博客 828

Java学数据结构(2)——树Tree & 二叉树binary tree & 二叉查找树 & AVL树 & 树的遍历

1.树的出现:解决链表线性访问时间太慢,树的时间复杂度O(logN); 2.二叉树的定义,最多两个儿子节点; 3.二叉查找树,左小,右大,中居中;remove方法,两种,只有一个儿子节点,有两个儿子节点; 4.AVL树,在二叉查找树基础上加平衡条件,旋转方法,单旋转,双旋转; 5.树的遍历方式,中序遍历,左根右;后续遍历,左右根;先序遍历,根左右;

Arya的博客,专注后端领域 1197
上一篇: 用栈来实现计算器功能运算
下一篇: 利用动态规划和递归分别求两个串的最大公共子序列
LuFei_java
博客等级 码龄10年 1粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值