当前位置: 首页 > article >正文

大话数据结构-查找-二叉排序树

注:本文同步发布于稀土掘金。

5 二叉排序树

5.1 概述

  二叉排序树(Binary Sort Tree)又称为二叉查找树,它或者是一棵空树,或者是具有下列性质的二叉树:

  (1) 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

  (2) 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

  (3) 它的左右子树,也分别为二叉排序树;

  我们使用如下方法创建一棵二叉排序树:

/**
 * create tree from array
 * <p>
 * the first element of data is the root node value
 *
 * @param data array
 * @author Korbin
 * @date 2023-04-23 11:38:06
 **/
public void createTreeFromArray(T[] data) {

    // set the first element as the root node
    root = new TreeNode<>();
    root.setData(data[0]);

    TreeNode<T> node = root;
    // iterate data
    for (int i = 1; i < data.length; i++) {
        while (null != node) {
            if (data[i].compareTo(node.getData()) <= 0) {
                // the value of data[i] little than node data or equals to node data
                TreeNode<T> leftNode = node.getLeftChild();
                if (null == leftNode) {
                    // if node has no left child
                    // set data[i] as node's left child
                    TreeNode<T> newNode = new TreeNode<>();
                    newNode.setData(data[i]);
                    node.setLeftChild(newNode);
                    break;
                } else {
                    // if node has left child
                    // set node as left child and continue
                    node = leftNode;
                }
            } else {
                // the value of data[i] greater than node data
                TreeNode<T> rightNode = node.getRightChild();
                if (null == rightNode) {
                    // if node has no right child
                    // set data[i] as node's right child
                    TreeNode<T> newNode = new TreeNode<>();
                    newNode.setData(data[i]);
                    node.setRightChild(newNode);
                    break;
                } else {
                    // if node has right child
                    // set node as right child and continue
                    node = rightNode;
                }
            }
        }
        node = root;
    }

}

  其中TreeNode实体定义如下所示:

import lombok.Data;

/**
 * Tree Node
 *
 * @author Korbin
 * @date 2023-04-23 11:35:08
 **/
@Data
public class TreeNode<T> {

    /**
     * value of node
     **/
    private T data;

    /**
     * left child
     **/
    private TreeNode<T> leftChild;

    /**
     * right child
     **/
    private TreeNode<T> rightChild;

}

5.2 查找

  由于是二叉排序树,满足左孩子结点一定小于根结点,根结点一定小于右孩子结点,因此可以很简单地使用递归的方式进行关键字查询:

/**
 * find node who's value equals key
 *
 * @param key key to find
 * @return searched node or null
 * @author Korbin
 * @date 2023-04-23 14:36:49
 **/
public TreeNode<T> findNode(T key) {
    return findNode(root, key);
}

/**
 * find node who's value equals key in tree
 *
 * @param tree root node of tree
 * @param key  key to find
 * @return searched node or null
 * @author Korbin
 * @date 2023-04-23 14:35:31
 **/
private TreeNode<T> findNode(TreeNode<T> tree, T key) {

    if (null == tree) {
        return null;
    }

    if (key.equals(tree.getData())) {
        // found node
        return tree;
    }

    if (key.compareTo(tree.getData()) < 0) {
        // find from left tree
        return findNode(tree.getLeftChild(), key);
    } else {
        // find from right tree
        return findNode(tree.getRightChild(), key);
    }

}

http://www.kler.cn/news/159902.html

相关文章:

  • Vue获取Promise then的返回值无效为空
  • 【ML】LSTM应用——预测股票(基于 tensorflow2)
  • [SQL]销售管理数据库的查询操作
  • 代码随想Day24 | 回溯法模板、77. 组合
  • 显示本周日历,左右滑动,日历翻页
  • UDP多人群聊
  • 区块链密码学:基础知识、应用与未来发展
  • c++ atmoic acquire/release
  • Python实现FA萤火虫优化算法优化随机森林分类模型(RandomForestClassifier算法)项目实战
  • Python脚本模拟真实设备刷视频播放量、浏览量
  • buuctf 加固题 babypython WriteUp
  • PyTorch分布式overview
  • 如何把kubernetes pod中的文件拷贝到宿主机上或者把宿主机上文件拷贝到kubernetes pod中
  • python将时间戳转换为时间
  • 用js自定义一个(v-model)vModel双向绑定函数
  • C语言给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)
  • Spark_spark hints 详细介绍
  • HTTPS安全防窃听、防冒充、防篡改三大机制原理
  • vuepress-----2、初体验
  • 安全测试工具,自动发现网站所有URL!
  • Docker本地部署Firefox火狐浏览器并远程访问
  • mysql:免费的GUI客户端工具推荐并介绍常用的操作
  • vue 基础
  • C++ 中的运算符重载(二)
  • 【Web】NewStarCTF Week3 个人复现
  • centos7 yum安装jdk1.8
  • Go 模块系统最小版本选择法 MVS 详解
  • 编译器缓存
  • 多线程(初阶七:阻塞队列和生产者消费者模型)
  • SQL 错误 [1476] [22012]: ORA-01476: 除数为 0