二分搜索树节点的插入及查找

目录

二分搜索树节点的插入

Java 实例代码

二分搜索树节点的查找

Java 实例代码

二分搜索树节点的插入

首先定义一个二分搜索树,Java 代码表示如下:

BST.java

public class BST, Value> {

    // 树中的节点为私有的类, 外界不需要了解二分搜索树节点的具体实现
    private class Node {
        private Key key;
        private Value value;
        private Node left, right;

        public Node(Key key, Value value) {
            this.key = key;
            this.value = value;
            left = right = null;
        }
    }
    // 根节点
    private Node root;
    // 树种的节点个数
    private int count;
    // 构造函数, 默认构造一棵空二分搜索树
    public BST() {
        root = null;
        count = 0;
    }
    // 返回二分搜索树的节点个数
    public int size() {
        return count;
    }
    // 返回二分搜索树是否为空
    public boolean isEmpty() {
        return count == 0;
    }
}

Node 表示节点,count 代表节点的数量。

以下实例向如下二分搜索树中插入元素 61 的步骤:

二分搜索树节点的插入及查找

(1)需要插入的元素 61 比 42 大,比较 42 的右子树根节点。

二分搜索树节点的插入及查找

(2)61 比 59 大,所以需要把 61 移动到 59 右子树相应位置,而此时为空,直接插入作为 59 的右子节点。

二分搜索树节点的插入及查找

插入操作也是一个递归过程,分三种情况,等于、大于、小于。

Java 实例代码

BinarySearchTreeInsert.java

/**
 * 二分搜索树插入新的元素
 */

public class BinarySearchTreeInsert, Value> {

    // 树中的节点为私有的类, 外界不需要了解二分搜索树节点的具体实现
    private class Node {
        private Key key;
        private Value value;
        private Node left, right;

        public Node(Key key, Value value) {
            this.key = key;
            this.value = value;
            left = right = null;
        }
    }

    private Node root;  // 根节点
    private int count;  // 树种的节点个数

    // 构造函数, 默认构造一棵空二分搜索树
    public BinarySearchTreeInsert() {
        root = null;
        count = 0;
    }

    // 返回二分搜索树的节点个数
    public int size() {
        return count;
    }

    // 返回二分搜索树是否为空
    public boolean isEmpty() {
        return count == 0;
    }

    // 向二分搜索树中插入一个新的(key, value)数据对
    public void insert(Key key, Value value) {
        root = insert(root, key, value);
    }

    //核心代码---开始
    // 向以node为根的二分搜索树中, 插入节点(key, value), 使用递归算法
    // 返回插入新节点后的二分搜索树的根
    private Node insert(Node node, Key key, Value value) {
        if (node == null) {
            count++;
            return new Node(key, value);
        }
        if (key.compareTo(node.key) == 0)
            node.value = value;
        else if (key.compareTo(node.key) < 0)
            node.left = insert(node.left, key, value);
        else    // key > node->key
            node.right = insert(node.right, key, value);

        return node;
    }
    //核心代码---结束
}

二分搜索树节点的查找

二分搜索树没有下标, 所以针对二分搜索树的查找操作, 这里定义一个 contain 方法, 判断二分搜索树是否包含某个元素, 返回一个布尔型变量, 这个查找的操作一样是一个递归的过程, 具体代码实现如下:

// 查看以node为根的二分搜索树中是否包含键值为key的节点, 使用递归算法
private boolean contain(Node node, Key key){

if( node == null )
return false;

if( key.compareTo(node.key) == 0 )
return true;
else if( key.compareTo(node.key) < 0 )
return contain( node.left , key );
else // key > node->key
return contain( node.right , key );
}

以下实例在二分搜索树中寻找 43 元素

二分搜索树节点的插入及查找

(1) 元素 43 比根节点 42 大,需要在右子节点继续比较。

二分搜索树节点的插入及查找

(2) 元素 43 比 59 小,需要在左子节点继续比较。

二分搜索树节点的插入及查找

(3) 元素 43 比 51 小,需要在左子节点继续比较。

二分搜索树节点的插入及查找

(4) 查找 51 的左子节点 43,正好和相等,结束。

如果需要查找 key 对应的 value,代码如下所示:

// 在以node为根的二分搜索树中查找key所对应的value, 递归算法
// 若value不存在, 则返回NULL
private Value search(Node node, Key key){

if( node == null )
return null;

if( key.compareTo(node.key) == 0 )
return node.value;
else if( key.compareTo(node.key) < 0 )
return search( node.left , key );
else // key > node->key
return search( node.right, key );
}

Java 实例代码

BinarySearchTreeSearch.java

/**
 * 二分搜索树查找
 */
public class BinarySearchTreeSearch, Value> {
    // 树中的节点为私有的类, 外界不需要了解二分搜索树节点的具体实现
    private class Node {
        private Key key;
        private Value value;
        private Node left, right;

        public Node(Key key, Value value) {
            this.key = key;
            this.value = value;
            left = right = null;
        }
    }
    // 根节点
    private Node root;
    // 树种的节点个数
    private int count;

    // 构造函数, 默认构造一棵空二分搜索树
    public BinarySearchTreeSearch() {
        root = null;
        count = 0;
    }

    // 返回二分搜索树的节点个数
    public int size() {
        return count;
    }

    // 返回二分搜索树是否为空
    public boolean isEmpty() {
        return count == 0;
    }

    // 向二分搜索树中插入一个新的(key, value)数据对
    public void insert(Key key, Value value){
        root = insert(root, key, value);
    }

    // 查看二分搜索树中是否存在键key
    public boolean contain(Key key){
        return contain(root, key);
    }

    // 在二分搜索树中搜索键key所对应的值。如果这个值不存在, 则返回null
    public Value search(Key key){
        return search( root , key );
    }

    //********************
    //* 二分搜索树的辅助函数
    //********************

    // 向以node为根的二分搜索树中, 插入节点(key, value), 使用递归算法
    // 返回插入新节点后的二分搜索树的根
    private Node insert(Node node, Key key, Value value){

        if( node == null ){
            count ++;
            return new Node(key, value);
        }

        if( key.compareTo(node.key) == 0 )
            node.value = value;
        else if( key.compareTo(node.key) < 0 )
            node.left = insert( node.left , key, value);
        else    // key > node->key
            node.right = insert( node.right, key, value);

        return node;
    }

    // 查看以node为根的二分搜索树中是否包含键值为key的节点, 使用递归算法
    private boolean contain(Node node, Key key){

        if( node == null )
            return false;

        if( key.compareTo(node.key) == 0 )
            return true;
        else if( key.compareTo(node.key) < 0 )
            return contain( node.left , key );
        else // key > node->key
            return contain( node.right , key );
    }

    // 在以node为根的二分搜索树中查找key所对应的value, 递归算法
    // 若value不存在, 则返回NULL
    private Value search(Node node, Key key){

        if( node == null )
            return null;

        if( key.compareTo(node.key) == 0 )
            return node.value;
        else if( key.compareTo(node.key) < 0 )
            return search( node.left , key );
        else // key > node->key
            return search( node.right, key );
    }
}

Original: https://www.cnblogs.com/siwuxiebuff/p/16208538.html
Author: 思无邪buff
Title: 二分搜索树节点的插入及查找

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/570257/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 深入理解super关键字

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月7日
    081
  • Java HashMap 四个构造函数

    HashMap():构造一个空的 HashMap ,默认初始容量(16)和默认负载系数(0.75)。 HashMap(int initialCapacity):构造一个空的 Has…

    Java 2023年6月5日
    078
  • 动态规划—摘花生

    Hello Kitty想摘点花生送给她喜欢的米老鼠。 她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。 地里每个道路的交叉点上都有种着一株花生苗,上面有若干…

    Java 2023年6月7日
    090
  • 设计模式之概述篇

    1、设计模式的本质 ​ 面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解。 2、设计模式的目的 ​ 提高代码可读性、重用性、可靠性、可…

    Java 2023年6月8日
    077
  • java servlet

    1.浏览器向服务器发出GET请求(请求服务器ServletA) 2.服务器上的容器逻辑接收到该url,根据该url判断为Servlet请求,此时容器逻辑将产生两个对象:请求对象(H…

    Java 2023年5月29日
    061
  • ant-design-vue中tree增删改

    1. 使用背景 新项目中使用了 ant-design-vue组件库.该组件库完全根基数据双向绑定的模式实现.只有表单组件提供少量的方法.所以,在使用 ant-design-vue时…

    Java 2023年6月13日
    061
  • Java随谈(五)Java常见的语法糖

    条件编辑 内部类 断言 基本类型自动装箱和包装类型拆箱 泛型和类型擦除 可变参数 foreach enum 枚举 try-with-resource switch 支持枚举和字符串…

    Java 2023年6月8日
    065
  • Javaweb07-三层架构(BaseDao)

    1、BaseDao 持久层业务接口实现类的公共父类,定义了jdbc操作数据库的所有公共方法,方便子类继承; import java.io.InputStream; import j…

    Java 2023年6月15日
    083
  • 如何去了解Spring

    对于你想了解的技术 官方总是一个合适的选择 首先,我们所指的Spring 一般指的是Spring Framework,伴随着的时代的进步,Spring全家桶也逐渐完善起来 Spri…

    Java 2023年6月8日
    0205
  • Thymeleaf小记

    最近学习javaweb 之前将很多的学习时间都用在了jsp 和 JQREY 的学习上,但是最近发现已经过时了,本来想学好后做项目的但是发现过时后很伤心,想做项目的心已经凉了,作为代…

    Java 2023年6月8日
    079
  • Redis篇:持久化、淘汰策略,缓存失效策略

    关注公众号,一起交流,微信搜一搜: 潜行前行 redis 持久化 redis 的数据是保存再系统内存里面的。持久化就是把内存的数据转移到磁盘中,redis 的持久化策略有两种:RD…

    Java 2023年6月5日
    098
  • 第三周

    第三周 1.测试成功的接口再次测试报错 原因:之前在查询时更改了方法,由Mybatis Plus 查询的方式改为了xml,同时在实体类中添加了字段做连表查询,导致之前所有用Myba…

    Java 2023年6月7日
    093
  • CSS样式

    css概述 层叠样式表(cascading style sheet) 层叠是指==将多个样式施加在一个元素(标签)上== 作用: 美化页面 将html代码与样式代码分离 好处: 功…

    Java 2023年6月6日
    0100
  • 高并发问题中 缓存 降级 限流 而限流是怎么实现的?

    在开发高并发系统时,有三把利器用来保护系统:缓存、降级和限流。那么何为限流呢?顾名思义,限流就是限制流量,就像你宽带包了1个G的流量,用完了就没了。通过限流,我们可以很好地控制系统…

    Java 2023年6月6日
    080
  • SpringBoot笔记(三):静态资源和动态模板

    SSM中的静态资源配置 Spring xml中通过节点配置静态资源: 还有一种简化的配置风格: 除了xml配置还可以通过java代码来配置静态资源: @Configuration …

    Java 2023年6月7日
    067
  • Notebook交互式完成目标检测任务

    摘要:本文将介绍一种在Notebook中进行算法开发的新方式,新手也能够快速训练自己的模型。 目标检测是计算机视觉中非常常用且基础的任务,但是由于目标检测任务的复杂性,往往令新手望…

    Java 2023年6月15日
    043
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球