手写JAVA代码实现二分搜索树

数据结构-BST树(1)-入门,遍历,节点添加 1.什么是BST树 Bst树又名二分搜索树,binary search tree,它是遵循一定规律的二叉树; 1.二分搜索树是二叉树; 2.二分搜索树每个节点的值: a.大于其左子树所有节点的值; b.小于其右子树所有节点的值; 3.每一棵子树也是二分搜索树; 如图: 就是说每往一个根节点添加元素时,左孩子要比根节点小,右孩子要比根节点大,不允许元素重复(可选项); 2.手写一个基本的BST... 阅读详情

一、二分搜索树简介

二分搜索树(英语:Binary Search Tree),也称为 二叉查找树 、二叉搜索树 、有序二叉树或排序二叉树。满足以下几个条件:

  • 若它的左子树不为空,左子树上所有节点的值都小于它的根节点。
  • 若它的右子树不为空,右子树上所有的节点的值都大于它的根节点。
    它的左、右子树也都是二分搜索树。
    如下图所示:
    在这里插入图片描述

二、具体实现

如上图所示:二分搜索树是由一个个节点组成,
节点由俩部分组成:

  • 1.元素
  • 2.指向左右子节点的指针
    根据上面节点的组成,定义节点如下:
private class Node{
        public E e;
        public Node left,right;
        public  Node(E e){
            this.e = e;
            left = null;
            right =null;
        }
    }

由于二分搜索树是由根节点进行排序,则需要记录根节点
则创建一个二分搜索树类BST:

//为了使元素支持各种类型,采用泛型
//因为需要排序,而元素E还应支持比较大小,则继承Comparable
public class BST<E extends Comparable<E>> {
	private Node root;
    private int size;
    public BST(){
        root = null;
        size = 0;
    }

1.添加元素

a.分析业务逻辑

在进行添加元素时,跟当前元素进行比较,
若小,则看其左节点是否为null,为null直接赋值到左节点上,否则继续递归。
若大,则看其右节点是否为null,为null直接赋值到右节点上,否则继续递归。

b.代码实现

方式一

//向二分搜索树中添加某一元素
    public void add(E e){
        if(root ==null){
            root = new Node(e);
            size++;
        }else{
            add(root,e);
        }
    }
    private void add(Node node,E e){
      if(e.equals(node.e)){
          return;
      } else if(e.compareTo(node.e)<0 && node.left == null){
          node.left = new Node(e);
          size++;
          return;
      }else if(e.compareTo(node.e)>0 && node.right == null){
          node.right = new Node(e);
          size ++;
          return;
      }
      if(e.compareTo(node.e)<0){
          add(node.left,e);
      }else if(e.compareTo(node.e)>0){
          add(node.right,e);
      }

    }

方式二

	//向二分搜索树中添加某一元素
    public void add(E e){
    	root = add(root,e);
    }
	private Node add(Node node,E e){
        if(node == null){
            size ++;
            return new Node(e);
        }
        if(e.compareTo(node.e)<0){
            node.left = add(node.left,e);
        }else if(e.compareTo(node.e)>0){
            node.right = add(node.right,e);
        }
        return node;
    }

2.遍历二分搜索树

方式一:深度优先遍历

//二分搜索树前序遍历
    public void preOrder(){
        preOrder(root);
    }

    private void preOrder(Node node){
        if(node ==null){
            return;
        }
        System.out.println(node.e);
        preOrder(node.left);
        preOrder(node.right);
    }

方式二:广度优先遍历(由上到下一层层遍历)

a.分析业务逻辑

1.当程序走到根节点时,节点中的元素可以拿到
2.当遍历第二层时,需要通过上一步节点中的左右节点获取元素
3.当遍历第三层时,还是需要通过上一步节点中的左右节点获取元素
…
由此看出,再执行第一步时,需要将根节点的左右节点放在一个地方进行存储,再执行第二步时,取出上一步放的节点node1,从而获取元素,并将node1节点的左右节点存储方便下一步进行取用。
根据以上特性,可以将左右节点存放在队列中
逻辑如下:读取root节点,取出root节点的元素,将root节点的左节点、右节点分别放入队列中,遍历第二层时,先取出左节点,取出节点元素,将此节点的左右节点分别放入队列中;再取出root的右节点执行上面操作…当队列中没有节点时,也就遍历结束。

b.代码实现
//广度优先遍历
    public void levelOrder(){
        Queue<Node> queue = new LinkedList<>();
        queue.add(root);
        while (!queue.isEmpty()){
            Node cur = queue.remove();
            System.out.println(cur.e);
            if(cur.left != null){
                queue.add(cur.left);
            }
            if(cur.right != null){
                queue.add(cur.right);
            }
        }
    }

3.删除元素

a.分析业务逻辑

1.删除的节点没有左右节点时,直接删除
2.删除的节点node有左节点或者右节点时,将node的左节点挂在node父节点上、或将node的右节点挂在node父节点上
3.删除的节点左右节点都存在时,这时就不能直接将该节点的左右节点挂在父节点上。需要从删除的节点node下,找出最小元素所在的节点放在node节点位置处。

b.代码实现
	//删除二分搜索树中元素e
    public void remove(E e){
        root = remove(root,e);
    }

    private Node remove(Node node,E e){
    	//需要删除的元素未找到
        if(node == null){
            return null;
        }
        //需要删除的元素比当前节点上元素小,则需要去其左节点进行删除
        if(e.compareTo(node.e)<0){
            node.left = remove(node.left,e);
            return node;
         //需要删除的元素比当前节点上元素大,则需要去其右节点进行删除
        }else if(e.compareTo(node.e)>0){
            node.right = remove(node.right,e);
            return node;
         //当前节点就是需要删除的
        }else {
        	//如果只存在右节点,则将右节点返回
            if(node.left == null){
                Node nodeRight = node.right;
                node.right = null;
                size --;
                return nodeRight;
            }
            //如果只存在左节点,则将左节点返回
            if(node.right == null){
                Node nodeLeft = node.left;
                node.left = null;
                size--;
                return nodeLeft;
            }
			//找到当前节点的右节点下最小元素所在节点
            Node middleNode = findMinimum(node.right);
            //将需要删除的node节点的左节点挂载
            middleNode.left = node.left;
            middleNode.right = removeMin(node.right);
            node.right = node.left = null;
            return middleNode;
        }
    }
    //查询node节点下最小的元素,返回最小元素所在的节点
    private Node findMinimum(Node node){
        if(node.left == null){
            return node;
        }
        return findMinimum(node.left);
    }
    //删除最小元素所在节点,返回其右节点
    private Node removeMin(Node node){
        if(node.left == null){
            Node nodeRight = node.right;
            node.right = null;
            size --;
            return nodeRight;
        }
        node.left =  removeMin(node.left);
        return node;
    }
信捷XD/XL系列PLC与C#通信实战:Modbus-RTU协议详解(附完整代码) 本文详细介绍了信捷XD/XL系列PLC与C#通过Modbus-RTU协议实现高效通信的实战指南。从硬件连接到软件配置,再到核心通信功能的实现与优化,提供了完整的代码示例和工业级应用建议,帮助开发者快速构建稳定的自动化通信系统。 阅读详情

相关推荐

海思MPP平台千兆以太网驱动集成与测试指南

千兆以太网(GE)是嵌入式视觉系统中音视频流传输与边缘控制的核心物理接口,其底层驱动需兼顾DMA高效调度、中断实时响应与PHY链路稳定性。在Linux嵌入式环境中,GE驱动通常基于net_device框架实现,并深度耦合于SoC专用媒体处理平台(如海思MPP),通过硬件抽象层(HAL)屏蔽寄存器操作,提供零拷贝、RGMII时序适配、描述符环管理等关键能力。技术价值体现在降低CPU负载、保障1080p@30fps实时推流、支持ONVIF/RTSP协议交互及固件远程升级。典型应用场景包括网络摄像机(IPC)、A

weixin_42599908的博客 89

Java二分查找法代码

Java二分查找方法体

一个会搜索的程序员 3369

一篇讲透:豆包、元宝、DeepSeek、Kimi、WorkBuddy,职场里到底怎么分工

这篇文章深入分析了当前主流AI工具(WorkBuddy、豆包、腾讯元宝、DeepSeek、Kimi)的特点和使用场景,帮助读者根据不同工作需求选择合适的AI助手。核心观点包括: AI工具各有所长:豆包适合快速创作初稿,元宝擅长信息检索整理,DeepSeek强于逻辑分析,Kimi专精文本处理,WorkBuddy则更适合任务推进和成果交付。 使用前需明确需求:是要创意发散、信息整理,还是任务执行?不同阶段应选用不同工具组合。 提供了6个具体职场场景的解决方案,包括文章创作、课程设计、会议纪要等,并给出详细的操作

weixin_39284145的博客 1万+

java实现二分查找

java实现二分查找

程序员阿龙的博客 1万+

西门子840D新建项目

1、需要一个32位的WIN7或者XP系统,并且已经在系统中安装完成西门子840Dsl开发包和VS2008。(我采用的是XP系统虚拟机) 2、在开始->所有程序找到如下位置 3、在这个位置打开Visual Studio 4、文件->新建->项目 名称和位置都可以随意更改,点击确定。 5、在左侧选择第二个选项进入下面的界面 点击“Add Screen”按钮 可以修改“class name”然后点击“OK”返回上一个界面,再点击“Add Form” 可以修...

qq_36987047的博客 1861

WPF基础系列六:MVVM框架

MVVM框架 文章目录MVVM框架前言一、MVVM框架简介1. 什么是MVVM?2. MVVM的优势3.MVVM的应用场景二、MVVM使用及示例 前言 在WPF开发中,经典的编程模式是MVVM,是为WPF量身定做的模式,该模式充分利用了WPF的数据绑定机制,最大限度地降低了Xmal文件和CS文件的耦合度,也就是UI显示和逻辑代码的耦合度,如需要更换界面时,逻辑代码修改很少,甚至不用修改。 与WinForm开发相比,我们一般在后置代码中会使用控件的名字来操作控件的属性来更新UI,而在WPF中通常是通过

iceberg7012的博客 2万+

二分查找的实现代码JAVA

> 1.前提: 有已排序数组A (假设已经做好) 2.定义左边界L、 右边界R,确定搜索范围,循环执行二分查找(3、4两步) 3.获取中间索引 M = Floor((L+R) 1/2) 4.中间素索引的值 A[M] 与待搜索的值T进行比较 ①A[M]==T 表示找到,返回中间索引 ②A[M]>T, 中间值右侧的其它元素都大于T,无需比较,中间索引左边去找,M- 1设置为右边界,重新查找 ③A[M]R时

小纯的博客 1400

PX4从放弃到精通(二十二):日志

文章目录前言一、下载日志二、ulog转CSV三、利用flightplot软件分析PX4的ulog日志1 windos安装2 ubuntu18.04安装四、使用PlotJuggler分析PX4日志五、设置日志记录条件六、添加自定义日志消息 前言 PX4 1.10以上固件 QGC 一、下载日志 将飞控链接地面站,在下图页面点击“刷新”,即可看到保存的日志(前提是要有TF卡) 选择需要下载的日志,点击右侧的“下载”,然后选择目录即可进行下载,如果想擦除所有的日志,可以点击右侧的“擦除全部” 二、ulog转CS

超维空间科技的博客 6793

二分查找算法java 21行代码实现

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

m0_53023044的博客 509

XCP实战系列介绍07-使用ASAP2 Editor生成A2l文件详解

介绍通过ASAP2 Editor工具生成A2l文件步骤详解

initiallizer的博客 7297

图像处理之边缘检测[微分算子、Canny算子和LOG算子]

LOG算子是在经典算子的基础上发展起来的边缘检测算子,根据信噪比求得检测边缘的最优滤波器。边缘总是以强度突变的形式出现,可以定义为图像局部特性的不连续性,如灰度的突变和纹理结构的突变等。图像的边缘包含了物体形状的重要信息,它不仅在分析图像时大幅度地减少了要处理的信息量,而且还保护了目标的边界结构。对于复杂的图像,采用Roberts算子不能较好地得到图像的边缘,而需要采用更加复杂的3X3的算子比如Prewitt算子。对于离散的图像f(x,y),边缘检测算子是用图像的垂直和水平差分来逼近梯度算子,即。

qq_44111805的博客 9833

Java实现二分搜索

二分查找:是一种算法,其输入是一个有序的元素列表(必须是有序的),如果查找的元素包含在列表中,返回其索引,否则返回负数。 比如说有一个1-100的数字,我随机的选择其中一个数字(假设为60),你需要以最少的次数猜到我所选择的数字,每次猜测后,我会告诉你大了,小了,对了。 如果我选的数字是60 第一次:你从50开始猜,那么我告诉你小了,就排除了接近一半的数字,因为你至少知道1-50都小了 第二次:你猜75,那么我告诉你大了,这样剩下的数字又少了一半!或许你已经想到了,我们每次猜测都是选择了中间的那个数

qq_47387991的博客 766

uniapp - Invalid value “iife” for option “output.format” - UMD and IIFE output formats are not suppo

Invalid value “iife” for option “output.format” - UMD and IIFE output formats are not supported for code-splitting builds. uniapp 编译报错,vite vue3 Hbuilder 中编译报错,uniapp 打包 App 报错(vue3)hbuilder提示错误,uniapp运行到手机/模拟器 App 报错(vue3)uniapp项目启动报错,如何解决这个问题,安卓app,苹果app

🏆 前端领域优质创作者 3965

二分搜索树节点的插入

首先定义一个二分搜索树,Java 代码表示如下:// 树中的节点为私有的类, 外界不需要了解二分搜索树节点的具体实现// 根节点// 树种的节点个数// 构造函数, 默认构造一棵空二分搜索树count = 0;// 返回二分搜索树的节点个数// 返回二分搜索树是否为空Node 表示节点,count 代表节点的数量。

fangfan9的博客 2486

数学建模模型总结

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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数据结构——用Java实现二分搜索树

Java实现二分搜索树,二叉树,树,二叉搜索树,LeetCode700,LeetCode701,LeetCode102

2301_77116754的博客 1308

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

二分搜索树节点查找:原理、实现与复杂度分析

本文介绍了二分搜索树(BST)的查找原理与实现方法。BST查找基于有序性,通过比较键值决定查找方向:小于当前节点向左子树查找,大于则向右子树查找。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1万+

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

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

Java实现二分搜索树

Java实现二分搜索树二分搜索树的定义二分搜索树的代码结构向二分搜索树添加元素(递归实现)对添加元素代码的简化(如果递归功底深厚)查看二分搜索树中是否还有元素e(递归)二分搜索树的前序遍历(递归)基于前序遍历重写toString二分搜索树的中序遍历二分搜索树的后序遍历二分搜索树的前序遍历(非递归)二分搜索树的层序遍历(非递归)(广度优先遍历)查找二分搜索树中的最大最小值删除二分搜索树的最小值与最大...

weixin_43388149的博客 756

java实现二分搜索树

1.二分搜索树定义 二分搜索树是一个二叉树 二分搜索树的节点的值大于左子树,小于右子树的值 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FAbuFGnW-1584198154042)(en-resource://database/739:0)] 2. 实现Binary Search Tree 2.1基本定义 public class BST<E exte...

sui_feng_piao_guo的博客 2674

二分搜索树节点插入:原理、实现与注意事项

二分搜索树插入操作详解:本文介绍了二分搜索树插入的基本原理,通过图示展示了插入61的过程(从根节点42开始比较,最终作为59的右子节点插入)。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 6822

Java 二分搜索树实现 - 完整代码

目录 1.二分搜索树: 1.1 概念 1.2 重点操作 1.3 完整代码 1.二分搜索树: 1.1 概念 a.是个二叉树(每个节点最多有两个子节点) b.对于这棵树中的节点的节点值 左子树中的所有节点值 < 根节点 < 右子树的所有节点值 二分搜索树中一般不考虑值相等的情况(元素不重复)JDK中的搜索树就不存在相同的值(TreeMap-key) 最大特点:也是判断是否是搜索树的方法 对该树进行中序遍历,就可以得到一个升序集合0 1 2 3 4 5 6 7 8

爱干饭的猿的博客 1641

二分搜索树的一些总结以及代码实现(java实现)

概念 二叉搜索树:对有一个树的任何结点,其右子树的值总是大于当前结点的值, 其左子树的值总是小于当前结点的值。 注意:线性表,队列,栈都可以存重复元素,树最好不要存。 功能实现 1.判断当前树的长度 2.判断当前树是否为空 3.给树添加元素,两种实现方法,一种是迭代法,一种是递归。 4.查找元素是否包含在树种 5.中序遍历 6.广度优先遍历(队列实现) 。。。未完 代码实现 package...

Hello什么来着? 834

Java —— 手动实现基于二分搜索树的集合

具体实现 手写实现Set集合感觉挺复杂的,但是在看过底层源码以及相关视频后就有了一些思路: 定义一个Set接口,这个接口中包含了要使用的方法 编写二分搜索树类,这个类里面就是Set接口里面的方法 实现二分搜索树集合类,主要是@Override二分搜索树中的方法 步骤对应代码如下: 一、Set接口 public interface Set<E> { /** ...

wxdsdyb的博客 248

二分搜索树的java实现

二叉搜索树的java实现 节点类 节点数据结构,结点中存储类型定义为泛型,注意存储的类型必须是可以比较大小的数据类型 private class Node{ //可比较大小的数据类型 public E e; public Node left,right; public Node(E e) { this.e = e; this.left = null; thi...

m0_37588915的博客 263

Java递归实现二分搜索树

导读: 本文分为两部分: 1.实现代码 2.测试代码 实现代码如下: private class Node{ public E e; public Node left, right; public Node(E e){ this.e = e; left = null; ...

lilei的博客 704

二分搜索树的层序遍历

二分搜索树的层序遍历,即逐层进行遍历,即将每层的节点存在队列当中,然后进行出队(输出节点)和入队(存入下一层的节点)的操作,以此达到遍历的目的 import java.util.LinkedList; import java.util.Queue; /** * @author BestQiang */ public class BST2&lt;E extends Comparabl...

BestQiang的博客 1万+

二分搜索树节点的插入(Java 实例代码)

/ 向以node为根的二分搜索树中, 插入节点(key, value), 使用递归算法。// 树中的节点为私有的类, 外界不需要了解二分搜索树节点的具体实现。// 树中的节点为私有的类, 外界不需要了解二分搜索树节点的具体实现。// 向二分搜索树中插入一个新的(key, value)数据对。// 树种的节点个数。// 返回插入新节点后的二分搜索树的根。// 返回二分搜索树的节点个数。// 返回二分搜索树的节点个数。// 返回二分搜索树是否为空。// 返回二分搜索树是否为空。//核心代码---开始。

2301_78835635的博客 366
上一篇: Explain详解及使用
下一篇: SQL索引优化实战之分页查询与关联查询
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值