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

目录

二分搜索树节点的插入

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)

大家都在看

  • win7安装MongoDB报错的问题(基本所有该踩的坑都踩了)

    昨天突发奇想想来玩一玩,然后安装了一下午才成功,基本所有该踩的坑都踩了,但当时没截图,现在靠着记忆写一下。 官网链接:https://www.mongodb.com/try/dow…

    Java 2023年6月5日
    0101
  • java 学习笔记

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

    Java 2023年5月29日
    075
  • SqlSessionFactory工具类抽取

    多次SqlSessionFactory创建对象问题解决 SqlSessionFactory工具类抽取 问题描述: 当我们多次使用SqlSessionFactory创建并获取对象时会…

    Java 2023年6月6日
    088
  • 基于XML的显式配置

    Spring提供了两种配置方式:一种是显式配置;一种是自动配置。显式配置又分为两种:一种是基于XML的显式配置;一种是基于Java的显式配置。自动配置只有一种,即基于注解的自动配置…

    Java 2023年6月5日
    095
  • 在web.xml配置springmvc过滤器解决乱码

    代码: <!–配置过滤器–> <filter> <filter-name>characterEncodingFilter</filte…

    Java 2023年6月9日
    059
  • SpringCloud : yml文件配置 获取系统环境变量的值

    注意,这里说的是获取系统环境变量的值,譬如Windows里配置的JAVA_HOME之类的,可以直接在Springboot的配置文件中获取。 我们经常使用一些docker管理平台,如…

    Java 2023年5月30日
    0146
  • Android自定义控件1

    概述 Android已经为我们提供了大量的View供我们使用,但是可能有时候这些组件不能满足我们的需求,这时候就需要自定义控件了。自定义控件对于初学者总是感觉是一种复杂的技术。因为…

    Java 2023年6月13日
    092
  • 设计模式-day06

    6.11 解释器模式 如上图,设计一个软件用来进行加减计算。我们第一想法就是使用工具类,提供对应的加法和减法的工具方法。 //用于两个整数相加 public static int …

    Java 2023年6月13日
    075
  • java中random()函数用法介绍

    Random() 创建一个新的随机数生成器。 代码如下 复制代码 Random(long seed) 使用单个 long 种子创建一个新的随机数生成器。 我们可以在构造Random…

    Java 2023年5月29日
    079
  • Java—-零钱通项目

    Java—-零钱通项目 项目要求:使用 Java 开发 零钱通项目 , 可以完成收益入账,消费,查看明细,退出系统等功能。 1. 面向过程 1)首先是这样一个菜单界面 …

    Java 2023年6月8日
    078
  • Java并发工具类-CounDownLatch

    背景 * Java1.5&#x5F15;&#x5165;&#xFF0C;&#x968F;&#x4E4B;&#x4E00;&#…

    Java 2023年6月5日
    078
  • SpringMVC 自定义类型转换

    1 定义自定义转化类 (实现 Converter package com.icemomo.convert; import org.springframework.core.conv…

    Java 2023年6月7日
    091
  • 常用 Maven 插件总结

    常用 Maven 插件总结 1、maven-source-plugin 提供项目自动将源码打包并发布的功能,在需要发布源码项目的pom.xml文件中添加如下代码即可执行mvn in…

    Java 2023年5月29日
    0109
  • jsoup教程

    在爬虫的时候,当我们用HttpClient之类的框架,获取到网页源码之后,需要从网页源码中取出我们想要的内容, 就可以使用jsoup这类HTML解析器了。可以非常轻松的实现。 虽然…

    Java 2023年6月7日
    085
  • 哈工大软件构造复习——关于“重载”与“重写”

    防扒链接: 写在前面 在复习软件构造课程的过程中,我对重载(Overload)与重写(Override)产生了不小的疑惑,因其名称的相似性,我时常会混淆二者的概念,因此特写下本篇博…

    Java 2023年6月9日
    084
  • Docker:Docker基础知识

    docker是什么 docker 是一个基于Go语言的开源应用容器引擎。 docker可以让开发者打包自己的应用到一个轻量级、可移植的容器中,实现容器化。 不同容器内的程序不会相互…

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