Java实现一个二叉查找树

ADT之二叉树代码实现 最近学习下了二叉树的基本操作的coding,分享下代码,使用VS编译,下面的程序运行结果: /** * 模块名称 : 二叉树 * 文件名称 : BiTree.c * 版 本 : V1.0 * 说 明 : 使用动态分配的链式结构实现的二叉树和基本操作 * 改 进 : 增加对树动态排序;增加destroy tree 的操作;增加求树的深度和各个层数的 阅读详情

查找树ADT-二叉查找树

二叉树的一个重要的应用就是它们在查找中的使用。假如树种每个节点存储一项数据,且无重复元素的情况。
二叉查找树要求所有项都能够排序。要写出一个一般类,我们需要提供interface来表示这个性质,这个接口就是Comparable。

   private static class BinaryNode<Integer>{
        public BinaryNode(Integer data){
            this(data,null,null);
        }

        BinaryNode(Integer data,BinaryNode<Integer> lt,BinaryNode<Integer> rt){
            this.data=data;
            this.left=lt;
            this.right=rt;
        }
        Integer data;
        BinaryNode<Integer> left;//左结点
        BinaryNode<Integer> right;//右结点
    }

其中唯一的数据域是对根节点的引用,这个引用对于空树来说是null,这些public方法使用了调用诸private递归方法的一般技巧。

public class BinarySearchTree<AnyType extends Comparable<? super AnyType>> {
    /**
     * 定义树结点
     * @param <Integer>
     */
    private static class BinaryNode<Integer>{
        public BinaryNode(Integer data){
            this(data,null,null);
        }

        BinaryNode(Integer data,BinaryNode<Integer> lt,BinaryNode<Integer> rt){
            this.data=data;
            this.left=lt;
            this.right=rt;
        }
        Integer data;
        BinaryNode<Integer> left;//左结点
        BinaryNode<Integer> right;//右结点
    }
    private Queue<BinaryNode<Integer>> queue;
    private BinaryNode<Integer> root;

    public BinarySearchTree(){
        root=null;
    }

    public void makeEmpty(){
        root=null;
    }

    public boolean isEmpty(){
        return root==null;
    }

    public boolean contains(Integer data){
        return contains(data,root);
    }


    public Integer findMin(){
        if (isEmpty())throw new BufferUnderflowException();{
            return findMin(root).data;
        }

    }

    public Integer findMax(){
        if (isEmpty()) throw new BufferUnderflowException();{
            return findMax(root).data;
        }
    }

    public void insert(Integer data){
        root =insert(data,root);
    }
    public void insert(List<Integer> list){
        for (Integer data: list) {
            root=insert(data,root);
        }
    }

    public void remove(Integer data){
        root =remove(data,root);
    }

    public void printTree(){
        if (isEmpty()) {
            System.out.println("Empty tree");
        }else{
            printTree(root);
        }
    }
    private boolean contains(Integer data, BinaryNode<Integer> t){
        if (t==null) {
            return false;
        }
        int compareResult=data.compareTo(t.data);
        if(compareResult<0)
            return contains(data,t.left);
        else if(compareResult>0)
            return contains(data,t.right);
        else
            return true;
    }


    private BinaryNode<Integer> findMin(BinaryNode<Integer> t){
        if (t==null) {
            return null;
        }else if(t.left==null){
            return t;
        }
        return findMin(t.left);

    }

    private BinaryNode<Integer> findMax(BinaryNode<Integer> t){
        if (t!=null) {
            while (t.right != null) {
                t=t.right;
            }
        }
        return t;
    }

    private BinaryNode<Integer> insert(Integer data,BinaryNode<Integer>t){
        if (t==null) {
            return new BinaryNode<>(data,null,null);
        }
        int compareResult=data.compareTo(t.data);
        if (compareResult<0){
            t.left=insert(data,t.left);
        }else if(compareResult>0){
            t.right=insert(data,t.right);
        }else;
        return t;
    }

    private BinaryNode<Integer> remove(Integer data,BinaryNode<Integer> t){
        if (t==null) {
            return t;
        }
        int compareResult=data.compareTo(t.data);
        if (compareResult<0){
            t.left=remove(data,t.left);
        }else if(compareResult>0){
            t.right=remove(data,t.right);
        }else if(t.left!=null&&t.right!=null){
            t.data=findMin(t.right).data;
            t.right=remove(t.data,t.right);
        }else {
            t = (t.left != null) ? t.left : t.right;
        }
        return t;
    }

    private void printTree(BinaryNode<Integer> t){
        if (t!=null) {
            printTree(t.left);
            System.out.println(t.data);
            printTree(t.right);
        }
    }

}

一、 contains方法

如果在树T中存在含有项X的节点,那么这个操作需要返回true,如果这样的节点不存在,则返回false。
树的结构使得这种操作很简单,如果T是空集,那么可以就返回false.否则,如果存储在T处的项是X,那么可以返回true。
否则,我们对树T的左子树或者右子树进行一次递归调用,这依赖于X与存储在T中项的关系。

二、findMin方法和findMax方法

这两个private分别返回树种包含最小元和最大元的节点的引用,为执行findMin,从根开始并且只要有左儿子,就向左进行。终止点就是醉笑的元素。
findMax除分支朝向右儿子外其余过程相同。
这种递归是如此容易以至于许多程序设计员不厌其烦的是同它,我们用两种方法实现了这两种Method。用递归写了findMin,用非递归写了findMax。

三、insert方法

这个插入操作在概念上是简单的,为了将X插入到树T中,你可以用contains那样沿着树查找,如果找到了X,则什么也不用做,或者做一些更新,否则,将X插入到遍历路径上的最后一点上。

四、remove方法

正如许多数据结构一样,最困难的是remove。一旦我们发现要被删除的节点,就需要考虑几种情况。
如果节点是一片树叶,那么它可以被立即删除,如果节点有一个儿子,则该节点可以再其父节点调整自己的链以绕过该节点后被删除。
复杂的情况是处理具有两个儿子的节点,一般的删除策略是用其右子树的最小的数据代替该节点的数据并递归删除那个节点,因为右子树中的最小的节点不可能有左儿子,所以第二次remove要容易。

HyperLynx(十八)DDR(一)DDR简介和DDR的数据仿真 LVTTL电平为单端信号,而SSTL电平本质上是差分对,其实现机制是将信号与参考电平Vref组成差分对进行比较,如图所示,VIH和VIL各有一个交流参数AC和直流参数DC,信号第一次越过AC门限的时刻,作为时序计算的参考点,此后只要信号保持DC门限内,逻辑状态保持不变,这种设计减小了噪声、振铃等对于信号质量的影响。经过调整后,控制器在发送颗粒1的DQS后,延时1ns再发送颗粒2的DQS,则颗粒1在1ns后收到对齐的DQS和CLK,颗粒2在2ns后收到对齐的DQS和CLK,从而满足了时序关系。 阅读详情

相关推荐

5分钟搞定!用FunASR在本地快速部署达摩院Paraformer语音识别模型(附常见问题解决)

本文详细介绍了如何在本地快速部署阿里达摩院开源的Paraformer语音识别模型。通过FunASR工具包,用户可在5分钟内完成环境配置、模型下载与基础识别,并掌握批量处理、性能调优及构建API服务等进阶技巧。文章重点解析了Paraformer的非自回归架构带来的速度优势,并提供了音频格式转换、依赖冲突、显存不足等常见问题的实战解决方案,助力开发者实现高效、离线的语音转写应用。

p1q2r的博客 708

java 方法的递归调用

1  递归调用是一种特殊获的调用形式,就是方法自己调自己 2 案例: package Lei; /**  *  * 从1+2+3+。。。。。。。。。。。。。+100  *  */ public class MethodDemo {  public static void main(String[] args)  {   System.out.println(addNum

panjiao119的博客 863

【Linux】Petalinux使用QSPI FLASH引导启动

1. 预分配Flash空间使用Flash引导Petalinux做的系统,也有进阶的做法。部分图片和经验来源于网络,若有侵权麻烦联系我删除,主要是做笔记的时候忘记写来源了,做完笔记很久才写博客。1. 预分配Flash空间根据生成的bit文件大小估算BOOT.BIN文件的大小,为Flash大概分配四个分区:boot、bootenv、kernel、bootscr,分别存放BOOT.BIN文件、u-boot的环境变量、内核文件(image.ub/zImage/uImage等)、启动脚本boot.scr。

Tesseract_9527的博客 3375

Java实现常见的查找算法--二叉树

参考:https://blog.youkuaiyun.com/smile_from_2015/article/details/72190562?utm_source=gold_browser_extension 二叉排序树 目标是插入和查找同样高效 假设我们的数据集开始只有一个数{62}, 然后现在需要将88插入数据集,于是数据集成了{62,88},还保持着从小到大有序。再查找有没有58,没有则插入,...

u014732103的博客 9164

铝合金外壳表面处理工艺全解析:从阳极氧化到瓷泳喷涂的7种方法对比

本文全面解析了铝合金外壳的7种主流表面处理工艺,包括阳极氧化、粉末喷涂、瓷泳喷涂等。通过对比其原理、性能、成本与应用场景,为产品设计师和工程师提供了从防护性、装饰性到功能性的立体选型框架,帮助您根据具体需求选择最佳工艺方案。

weixin_29278805的博客 748

Python语言在工业控制中的简单应用

在工业控制中,经常需要对采集到的数据进行分析和处理,Python的这些库可以简化这一过程。传统的工业控制系统多依赖于专用的控制硬件和软件,但随着技术的发展,开放性和灵活性成为了新的需求焦点。还有,Python社区活跃,提供了大量的开源代码和模块,这对于工业控制领域来说是一个巨大的资产。Python作为一种高级编程语言,因其简洁的语法、强大的库支持和广泛的社区资源而在工业界获得了快速的发展和广泛的应用。在工业控制领域,Python的应用日益增多,这得益于其跨平台性、脚本语言的灵活性以及与硬件设备交互的能力。

2303_78014702的博客 1722

Java 实现:判断二叉树A是否包含子树B

判断二叉树A是否包含子树B 三种情况: 1、二叉树A和B根节点相同 2、B是A的左子树 3、B是A的右子树 /*题目 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) * * */ /*思路 * * 先从根节点开始判断, * 1.如果根节点相同,则从头遍历 * 2.如果根不同,则从左右两个遍历,任意一个含有B树都可以,如果失败则递归 * doesTree1HasTree2函数负责递归两个遍历两个树,直到B树为空则返回true其余都是false * *

jack_shuai的博客 835

【Android】汽车电源管理:深入解析CarPowerManager与Suspend To RAM的交互机制

本文深入解析了Android Automotive OS中CarPowerManager与Suspend To RAM(深度睡眠)的交互机制。详细阐述了从车辆发出睡眠请求,到CarPowerManagementService协调应用状态,最终通过内核进入低功耗睡眠的完整流程,并探讨了唤醒机制、开发者实践及功耗优化策略,为车机应用开发与系统优化提供关键指导。

weixin_28339967的博客 292

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

24. 在QML界面中嵌入QWidget窗口

目前QT官方主推的界面开发方式是采用QML进行界面设计,但在QML未流行之前,很多的项目都是采用QWidget开发的,把之前的代码全部转换为QML代码显然工作量非常大,如果能将QWidget窗口嵌入到QML界面中,那么开发效率将提高很多,且QML无法实现的功能也能借助于QWidget框架进行实现。

山间点烟雨 5922

SerDes学习笔记:DFE均衡架构示例(USB3.1、PCIe3.0\4.0)

本文探讨了DFE均衡器架构在不同数据接口中的应用特性。研究表明,抽头数量随数据速率提升而增加,1-16抽头架构较为常见。通过PCIeGen3/4实例分析,对比了单抽头、双抽头和15抽头DFE的性能差异,证明多抽头结构能通过精细调节有效提升噪声容限和降低误码率。文章详细阐述了DFE工作原理,包括其通过反馈信号对输入信号的补偿机制,以及不同抽头对消除码间干扰的作用。实验采用8Gbps速率(125ps/UI)进行波形仿真,直观展示了均衡处理前后的信号变化,为理解信道均衡技术提供了重要参考。

一只豌豆象的博客 519

Java上亿数据查找树_怎么在java项目中实现一个二叉查找树算法

怎么在java项目中实现一个二叉查找树算法发布时间:2020-12-01 17:14:39来源:亿速云阅读:73作者:Leah今天就跟大家聊聊有关怎么在java项目中实现一个二叉查找树算法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。具体内容如下package查找;importedu.princeton.cs.algs4.Queue;i...

weixin_34546240的博客 159

全栈拆解华为乾崑 ADS 5:WEWA2.0智能体架构与安全风险场技术、实现多传感器全融合感知与主动安全预判、助力城市NOA/高速领航/全场景无人通行极致落地

华为乾崑ADS 5的核心颠覆性,不在于单一功能的小幅升级,而在于实现了自动驾驶从“工具式辅助驾驶”到“拟人化智能体驾驶”的全栈范式革命。通过WEWA 2.0端云协同AI智能体架构,解决了传统智驾决策僵硬、博弈能力弱、学习效率低的行业痛点;通过行业首发安全风险场技术,将自动驾驶安全体系从被动避险升级为主动预判,直接减半行车风险;通过乾崑OS专属车规系统底座,保障高阶智驾的低时延、高稳定、高可靠运行;通过多传感器超融合感知体系,实现全场景、全天候、无盲区的精细化环境理解。

getusushu的博客 294

二叉查找树

叉查找树一般用的不是很多,但是它是平衡二叉树和红黑树的基础,所以还是要好好了解一下的。 首先说一下什么是二叉查找树: 二叉查找树是一种特殊的二叉树,特殊在哪呢? 1.对于树中的任意节点X,如果它的左子树不为空,则左子树中的所有节点的值均小于X的值。 2.对于树中的任意节点X,如果它的右子树不为空,则右子树中的所有节点的值均大于X的值。 3.二叉查找树的中序遍历是一个从小到大的有序序列。

xjiaozhen 535

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

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

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

算法设计与分析——二叉查找树(Java)

二叉查找树 (binary search tree) 是具有下列性质的二叉树:(1) 若它的左子树不空,则左子树上所有结点的值均小于根结点的值;(2) 若它的右子树不空,则右子树上所有结点的值均大于根结点的值;(3) 它的左右子树也都是二叉排序树。在二叉查找树上进行查找,与待查值比较后,根据比较结果只需要查找两个子树之一,因此,二叉查找树也是减治技术的成功应用。 【问题】 【想法】 【问题】在一个无序序列中执行查找操作,可以将无序序列建立一棵二叉查找树,然后在二叉查找树中查找值为k的记录,若查找成功,返回记

qq_53709454的博客 446

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

查找(二)—— 二叉查找树

参考:数据结构与算法分析——Java语言描述  (美)Mark Allen Weis          我们都知道,二叉树中每个节点都不能有多于两个的儿子。要使二叉树成为二叉查找树,要满足这样的性质:对于树中的每个节点x,它的左子树中的所有项的值小于x中的项,而它的右子树中的所有项的值大于x中的项。         上面的这个性质的说明,没有明显地指出值相等的元素的情况。当然可以把重复的元插入

1098

VB摄像头监控

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

使用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

二叉查找树的创建及遍历

二叉查找树的创建及遍历 前言 对于线性表,或者符号表,无论是利用数组实现,还是链表实现,都不能达到比较完美。 基于数组实现的顺序表,查询快(内存连续,通过索引即可查询),但增删慢(需要大量的数据移动);基于链表实现,查询慢(每次查询都要从头结点找起),但增删快(没有数据移动的操作)。 但是,树的特性可以弥补线性表中的不足。顺序表天生查询快,增删慢,可以结合树的特性使其增删加快;链表天生增删快,查询慢,可以结合树的特性使其查询加快。 本文讲解什么是树、什么是二叉树以及树的一些相关术语,并介绍二叉查找树的创建与

Mekeater的博客 843

【182】Java8利用二叉查找树实现Map

本文利用二叉查找树写了一个Map,用来保存键值对。

zhangchao19890805的专栏 747

Java实现二叉查找树

摘要:一个二叉查找树的Java实现。可以学习二叉树处理的递归及非递归技巧。 难度:初级。 为了克服对树结构编程的恐惧感,决心自己实现一遍二叉查找树,以便掌握关于树结构编程的一些技巧和方法。以下是基本思路: [1] 关于容器与封装。封装,是一种非常重要的系统设计思想;无论是面向过程的函数,还是面向对象的对象,都是...

weixin_30502965的博客 74

Java实现-不同的二叉查找树1

给出 n,问由 1...n 为节点组成的不同的二叉查找树有多少种? 您在真实的面试中是否遇到过这个题?  Yes 样例 给出n = 3,有5种不同形态的二叉查找树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1

Narasimha_Karumanchi 337

java二叉查找树

借鉴了网上一位前辈的代码,自己改了一点

hellobeifeng的专栏 651

JAVA向,二叉查找树

满足二叉查找树的存储规则。 类似折半查找: import javax.management.remote.rmi._RMIConnectionImpl_Tie; /** * Created by John on 14-5-22. */ public class IntTree { private static class IntTreeNode {

Pxjw.Home 853

163. 不同的二叉查找树

163.不同的二叉查找树 给出n,问由 1...n为节点组成的不同的二叉查找树有多少种? 样例 样例 1: 输入:n = 3 输出:5 解释:有5种不同形态的二叉查找树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3 public class Solution { /** * @param n: An integer * @return: An...

时代我西的博客 105

java 树节点排序_Java基于二叉查找树实现排序功能示例

本文实例讲述了Java基于二叉查找树实现排序功能。分享给大家供大家参考,具体如下:/*** 无论排序的对象是什么,都要实现Comparable接口** @param */public class BinaryNode> {private static int index = 0; // 排序下标private static int len = 0; // 最大数组长度private T t;...

weixin_39703926的博客 115

二叉查找树——java语言描述

二叉查找树上执行基本操作的时间 与树的高度成正比。 二叉查找树中关键字的存储方式满足以下二叉查找树性质: 设x为二叉查找树中的一个节点。如果y是x的左子树中的一个节点,则key[y] 如果y是x的右子树的一个节点,则key[x] 下面转载一篇二叉查找树java 实现的代码,供参考学习。api的实现方式不只一种,比如查找,可以 用循环遍历的方式也可以用递归的 方式实现;节点删除也有更简

chengmaoning的专栏 594
上一篇: centos7下配置pip和pip3
下一篇: 记录设计模式
panda_lgn
博客等级 码龄8年 6粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值