二叉查找树实现

2023-11-14

package leetcode.May;

import java.util.ArrayList;
import java.util.List;

/**
 * @description: 二叉查找树
 * @author: qiangyuecheng
 * @date: 2022/5/31 17:00
 */
public class BST<Key extends Comparable<Key>,Value>{
    public class Node{
        private Key key;
        private Value value;
        private Node left;
        private Node right;
        public int num;
        public Node(Key key,Value value){
            this.key = key;
            this.value = value;
            this.left = null;
            this.right = null;
            this.num = 1;
        }
    }

    private Node master;
    public void put(Key key,Value value){
        if(master==null){
            master = new Node(key,value);
        }else {
            Node node = new Node(key,value);
            put(master,node);
        }

    }
    public Node put(Node lord,Node node){
        if(lord==null){
            return node;
        }
        int bool = node.key.compareTo(lord.key);
        if(bool>0){
            lord.right = put(lord.right,node);
        }else if(bool<0){
            lord.left = put(lord.left,node);
        }else {
            System.out.println("key不能重复");
            return null;
        }
        lord.num = getNum(lord.right)+getNum(lord.left)+1;
        return lord;

    }

    public int getNum(Node node){
        if(node!=null){
            return node.num;
        }else {
            return 0;
        }
    }

    public Node get(Key key){
        return get(key,master);
    }
    public Node get(Key key,Node node){

        if(node==null){
            System.out.println("没有");
            return null;
        }
        int bool = key.compareTo(node.key);
        if(bool==0){
            return node;
        }
        if(bool>0){
            return get(key,node.right);
        }else {
            return get(key,node.left);
        }


    }

    /**
     * 查找排名为k的节点
    */
    public void select(int k){
        System.out.printf(""+ select(master, k).value);

    }

    public Node select(Node node,int k){
        if(node==null){
            return null;
        }
        int n = getNum(node.left);
        if(n>k){
            return select(node.left,k);
        }else if(n<k){
            return select(node.right,k-n-1);
        }else {
            return node;
        }


    }


    /**
     * 查找范围的key个数
    */
    public void select(Key key1,Key key2){
        List<Node> list = new ArrayList<>();
        select(master,key1,key2,list);
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).key);
        }
    }

    public void select(Node node,Key key1,Key key2,List list){
        if (node==null){
            return;
        }
        int a = node.key.compareTo(key1);
        if(a>=0){
            select(node.left,key1,key2,list);
        }
        int b = node.key.compareTo(key2);
        if(a>=0&&b<=0){
            list.add(node);
        }

        if(b<=0){
            select(node.right,key1,key2,list);
        }
    }

    /**
     * 返回以x为根结点的子数中小于x.key的键的数量
    */
    public void rank(Key k){
        System.out.println(rank(master,k));
    }
    public int rank(Node node,Key k){
        if(node==null){
            return 0;
        }
        int t = node.key.compareTo(k);
        if(t>0){
            return rank(node.left,k);
        }else if(t<0){
            return rank(node.right,k)+getNum(node.left)+1;
        }else {
            return getNum(node.left);
        }
    }

    /**
     * 删除最大键
    */
    public void deleteMax(){
        master = deleteMax(master);

    }
    public Node deleteMax(Node node){
        if(node.right==null){
            if(node.left!=null){
                return node.left;
            }
            return null;
        }
        node.right = deleteMax(node.right);
        node.num = getNum(node.left)+getNum(node.right)+1;
        return node;
    }

    /**
     * 删除最小键
    */
    public void deleteMin(){
        master = deleteMin2(master);
    }
    public Node deleteMin(Node node){
        if(node.left==null){
            if(node.right!=null){
                return node.right;
            }
            return null;
        }
        node.left = deleteMin(node.left);
        node.num = getNum(node.left)+getNum(node.right)+1;
        return node;
    }

    /**
     * 删除key键
    */
    public void delete(Key key){
        master = delete(master,key);
    }
    public Node delete(Node node,Key key){
        //找到
        int t = node.key.compareTo(key);
        if(t>0){
            node.left = delete(node.left,key);
        }else if(t<0){
            node.right =  delete(node.right,key);
        }else {
            if(node.left==null){
                return node.right;
            }
            if(node.right==null){
                return node.left;
            }
            //替换右子树最小结点
            //找到最小结点
            Node tmp = node;
            node = getMin(tmp.right);
            //删除最小结点 这里必须是先right后left 因为没删tmp.right之前不能给node.left赋值,
            // 因为node是要删除的结点,赋值以后会导致循环引用
            node.right = deleteMin2(tmp.right);
            node.left = tmp.left;
        }
        node.num = getNum(node.left)+getNum(node.right)+1;
        return node;
    }

    public Node getMin(Node node){
        if(node==null){
            return null;
        }
        if(node.left!=null){
            return getMin(node.left);
        }else {
            return node;
        }
    }


    public Node deleteMin2(Node node){
        if(node.left==null){
            if(node.right!=null){
                return node.right;
            }
            return null;
        }
        node.left = deleteMin2(node.left);
        node.num = getNum(node.left)+getNum(node.right)+1;
        return node;
    }

    /**
     * show
    */
    public void show(Node node){
        iteration(node);
    }
    public void show(){
        iteration(master);
    }

    /**
     * 中序遍历
    */
    public void iteration(Node node){
        if(node==null){
            return;
        }
        if(node.left!=null){
            iteration(node.left);
        }
        System.out.println(node.value);
        if(node.right!=null){
            iteration(node.right);
        }
    }

    public static void main(String[] args) {


        BST bst = new BST();

        bst.put("e","555");
        bst.put("b","222");
        bst.put("a","111");
        bst.put("c","333");
        bst.put("d","444");
        bst.put("f","666");
        //System.out.printf(""+ bst.get("b").value);
        //bst.select(5);
        //bst.show();
        //bst.select("b","d");
        //bst.rank("d");
        //bst.show();
        //bst.deleteMin();
        //System.out.println();
        //bst.show();
        //bst.select("b","d");
        //bst.deleteMax();
        //bst.deleteMax();
        //bst.deleteMin();

        bst.delete("f");
        bst.show();

    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二叉查找树实现 的相关文章

  • Java OS X Lion 关于菜单

    我正在尝试覆盖 OS X Lion 上的 Java 应用程序或 Leopard 及以上版本中的任何内容中的 关于 菜单 我怎么做 到目前为止 我读过的教程似乎不是最新的 一些类不再在 Java Mac SDK 中 其他类的事件也没有被触发
  • Spring Boot 自动将 JSON 转换为控制器中的对象

    我有具有该依赖项的 Spring Boot 应用程序
  • 如何将H2数据库文件存储到项目目录中

    当我使用H2数据库时 数据库文件存储在C Users MyName TestDataBase db目录 H2路径是jdbc h2 TestDataBase 这是默认的 H2 数据库路径 是否有可能像这样将 H2 数据库文件存储到我的项目目录
  • 如何使用Gson序列化Optional类?

    我有一个具有以下属性的对象 private final String messageBundle private final List
  • App Engine 日志中的 /_ah/queue/__deferred__

    我有一个使用 Google Cloud SQL 的 App Engine 应用程序 并且从我的应用程序的页面中我正在执行一些数据库操作 每当访问此页面时 它都无法执行所有数据库操作 当我进入控制台时 我看到的只是 ah queue defe
  • 如何使 Java 中的自定义泛型类型链表排序?

    我正在用 java 编写自己的泛型链表 而不是使用 java 集合链表 链表的add方法由以下代码组成 public void add T item int position Node
  • Android:Json 无法从 mysql 数据库检索任何文件,它是空的

    我是 android 新手 我正在使用 mysql 数据库 其中我链接 php 文件进行连接 工作正常 但我的代码没有显示任何内容 它只显示背景色黑色 而不是显示数据库中的数据 public class HomeFragment exten
  • 为什么图很大时x轴消失了

    我正在尝试使用加载大图JFreeChart 但是 当缓冲图像超过一定大小时 X 轴会出现问题 这些值在 X 轴上消失 这可以在图像的第三张图中看到 I would appreciate any help in fixing the prob
  • Wicket setResponsePage() 方法如何工作?

    在学习 JSP 和 servlet 时 我听说了重定向和调度 他们中的哪一个做 Wicket 的setResponsePage 履行 What setResponsePage确实取决于几个因素 您调用 setResponsePage 的次数
  • 根据使用频率随机生成字母?

    如何根据常用语音中的使用频率随机生成字母 任何伪代码都值得赞赏 但如果用 Java 实现就更棒了 否则 只需朝正确的方向戳一下就会有所帮助 注意 我不需要生成使用频率 我确信我可以很容易地查找到它 我假设您将频率存储为 0 到 1 之间的浮
  • 如何处理过时的连接?

    我们的应用程序是一个 J2EE 应用程序 在 Websphere 6 1 上通过 Mainframe DB2 后端使用 Struts EJB Hibernate 最近已投入生产 我们收到过时的连接异常当用户第一次或有时登录应用程序时 此异常
  • 编写无 BOM 的 UTF-8

    这段代码 OutputStream out new FileOutputStream new File C file test txt out write A getBytes 和这个 OutputStream out new FileOu
  • 如何从 Java 中的字符串表示形式获取 Locale?

    有没有一种巧妙的方法来获得Locale http java sun com javase 6 docs api java util Locale html来自 Locale 返回的 编程名称 的实例toString 方法 一个明显且丑陋的解
  • 比较 Java 中的两个基元数组?

    我知道 Arrays deepEquals Object Object 但这不适用于原始类型 由于数组和自动装箱的限制 请参阅这个相关帖子 https stackoverflow com questions 517751 java gene
  • 面向 Clojure 用户的 Java

    我一直在断断续续地使用 Lisp 并且正在赶上 clojure clojure的好处是我可以自然地使用所有的java函数 而clojure的坏处也是我必须自然地了解java函数 例如 我不得不花一些时间 谷歌搜索 来查找 Java 中的平方
  • 如何使用 jasper 从 jsp 生成 pdf 格式的报告

    在我的应用程序中 我可以连接到数据库并获取数组结果集 并使用 JSP 代码迭代该数组并使用 HTML 在网页中显示报告 我希望 HTML 网页中生成的报告可以以 PDF 格式导出并保存在某个 pdf 文件中 请告诉我如何实现这样的技术来实现
  • 在idea ide中出现钻石运算符的编译错误

    我在尝试在idea ide中编译一些简单的源代码时收到此错误 java diamond operator is not supported in source 1 6 use source 7 or higher to enable dia
  • 为什么枚举可以有包私有构造函数?

    既然枚举构造函数只能由其常量调用 为什么允许它是包私有的呢 构造函数实际上不是包私有的 它是隐式的private接口方法的隐式方式public即使您不添加关键字 JLS 的相关部分 8 8 3 http docs oracle com ja
  • 在自定义 BaseAdapter 子类中使用 Butter Knife 会导致“无法注入视图”错误

    我正在尝试使用 Butter Knife 来简化自定义 BaseAdapter 类的创建 我正在遵循这里的示例 http jakewharton github io butterknife http jakewharton github i
  • Spring Data JPA 中使用 @Query 进行动态查询?

    我在 Spring Boot 应用程序中使用规范 可以通过不同的过滤器选项过滤结果 但是 我需要使用特殊的过滤器 Query在我的存储库方法中 据我所知 我无法在此查询中构建动态 WHERE 子句 还有 QueryDSL 和 Criteri

随机推荐

  • 搭建第一个Dapp应用(4)——搭建SmartDev-Scaffold——2021.5.3

    搭建第一个Dapp应用 4 搭建SmartDev Scaffold 一丶环境配置 Java gt JDK 1 8 Solidity 0 4 25 Git 下载安装包需要使用Git Gradle 大于6 小于7 使用gradle7会报错 二丶
  • JavaEE规范与系统结构

    JavaEE规范 JavaEE规范是J2EE规范的新名称 早期被称为J2EE规范 其全称是Java 2 Platform Enterprise Edition 它是由SUN公司领导 各厂家共同制定并得到广泛认可的工业标准 JCP组织成员 之
  • Jenkins之定时构建

    1 操作环境 1 Jenkins Jenkins 2 75 2 定时构建 1 定时构建语法 第一个 表示分钟 取值0 59 第二个 表示小时 取值0 23 第三个 表示一个月的第几天 取值1 31 第四个 表示第几月 取值1 12 第五个
  • 由java:local_policy.jar和US_export_policy.jar引发的“血案”

    起因 今天项目上线 上线后监测日志 发现由异常 开始查找问题 进而引发了 血案 线上日志报错如下 Illegal key size 画外音 看到线上项目出现问题心里慌的一批 赶紧扒拉出代码 一行一行对着报错日志查看 最后定位到 AES ae
  • 制作SD卡启动盘(编译烧写u-boot)

    一 SD启动盘制作 将我们的sdfuse q文件夹拷贝到虚拟机Ubuntu的共享目录下 sudo cp samba NFS FTP sdfuse q a 将文件夹复制到 home chen 目录下 cd sdfuse q 进入sdfuse
  • 西门子PLC s7-1200学习之路

    1 Introduction 最近因为一个项目需要使用西门子PLC 买了一个入门级的PLC s7 1200 并完成了一个PLC和PC通过TCP进行通信的小程序 为了防止活干完了 内容就全忘了 所以用一个笔记进行梳理和总结 入门一种语言 需要
  • 专访蒋宇捷:技术管理者应具备哪些能力?(转载)

    摘要 近期 本站记者采访了CSDN社区活跃用户 百度技术经理蒋宇捷 他认为一个合格的技术管理者应该具备深度认知产品 冷静决策 以及良好的沟通能力 还要秉持着技术源于一线 永远不能脱离一线的观念 蒋宇捷 西安交通大学硕士 现任百度技术经理 曾
  • [系统安全] 三十九.Powershell恶意代码检测系列 (1)Powershell基础入门及管道和变量的用法

    您可能之前看到过我写的类似文章 为什么还要重复撰写呢 只是想更好地帮助初学者了解病毒逆向分析和系统安全 更加成体系且不破坏之前的系列 因此 我重新开设了这个专栏 准备系统整理和深入学习系统安全 逆向分析和恶意代码检测 系统安全 系列文章会更
  • 水杯测试用例小记

    水杯测试用例
  • python编写数学公式-Python引入数学函数计算

    Python引入数学函数计算 在利用Python对Abaqus进行相关编程时经常需要用到数学函数 比如三角函数等 在使用这些函数之前需要先引入数学模块 Import math 之后利用时还需要利用层级关系 比如math pi表示 一个示例如
  • go: no such tool “compile“(一次糟糕体验)

    这是一次离谱问题和胡搞一通莫名解决的记录 背景 win11系统下 原有的go1 18更新到go1 19后出现了莫名的go no sucn tool compile 的情况 当时检查go env 如下 PS D Desktop gt go e
  • pycharm使用wsl、SSH

    pycharm wsl 修改apt get源 安装miniconda 配置pycharm SSH Using the Python remote debug server configuration wsl windows sub linu
  • Python10行代码实现模拟百度搜索

    作者主页 士别三日wyx Python模拟百度搜索 1 获取百度搜索接口 2 指定搜索内容 3 UA伪装 4 将响应内容写入文件 5 使用浏览器打开页面 源码如下 1000块钱做个百度 能提出这种要求的客户实乃乙方克星 民族之光 科创永动机
  • 30个落地案例告诉你,区块链到底怎么用

    区块链的商业价值 一千个企业就有一千种解读 唯链 VeChain 起步于2015年 作为国内知名的公链项目之一 它的行事作风一直显得不太 合群 大多数公链生态所追随的热点如DAPP游戏开发 Defi Staking等等 唯链似乎都鲜少参与
  • [STL]vector常见用法详解

    目录 引入 常见用法介绍 1 vector的定义 2 vector容器内元素的访问 3 vector常用函数实例解析 1 push back 2 pop back 3 size 4 clear 5 insert 6 erase vector
  • 如果有一天程序员再也不忙了

    前言 程序员是世界上最可爱的人 正文 一 程序员是什么 二 程序员写的代码有什么用 三 程序员最本质的不同是什么 四 程序员为什么找不到妹子 五 程序员的工作究竟有多忙 六 有一天程序员不忙了会怎样 七 找不到妹子真的是因为工作忙吗 八 你
  • .NET Core 获取自定义配置文件信息

    官方文档说 引用 Microsoft AspNetCore App 元包或将包引用添加到 Microsoft Extensions Options ConfigurationExtensions 包 简而言之 直接可以获取 不用引用包了 a
  • 盖茨来了:比起去火星,地球有些事更紧迫

    2023年6月14日晚 比尔 盖茨在微博更新了一条消息 他写道 我刚降落在北京 这是我2019年以来的首次访问 盖茨基金会与中国伙伴合作应对全球健康和发展挑战已经超过15年 我非常高兴能与中国的伙伴们见面 在减少儿童死亡和贫困方面 世界取得
  • CSS层叠样式表-选择器

    1 CSS 1 特点 相同属性会覆盖 不同属性会叠加 2 引入方式 外部样式 在head标签中使用link标签引入css文件 内嵌样式 在head标签中使用style标签进行书写 行内样式 在对应标签中添加style属性 1 外部样式 W3
  • 二叉查找树实现

    package leetcode May import java util ArrayList import java util List description 二叉查找树 author qiangyuecheng date 2022 5