算法练习-二叉搜索树中的搜索(思路+流程图+代码)

难度参考

        难度:中等

        分类:二叉树

        难度与分类由我所参与的培训课程提供,但需要注意的是,难度与分类仅供参考。且所在课程未提供测试平台,故实现代码主要为自行测试的那种,以下内容均为个人笔记,旨在督促自己认真学习。

题目

        给定二叉搜索树(BST)的根节点和一个值。你需要在BST中找到节点值等于给定值的节点。返回以该节点为根的子树。如果节点不存在,则返回NULL.
        示例1:
        输入:root=[4,2,7,1,3],val=2
        输出:[2,1,3]

        示例2:
        输入:root=[4,2,7,1,3],val=5
        输出:[]
        提示:
        树中节点数在[1,5000]范围内
        1<=Node.Va1<=10(7)
        root是二叉搜索树
        1<=val<=10(7)
        额外:
        希望你可以尝试使用迭代法,尤其要考虑二叉搜索树的特性,来优化迭代。

思路

        这个问题要求在一个二叉搜索树中查找一个特定值的节点,并且返回以这个节点为根的子树。如果找不到这个值,则返回NULL。由于这是一个二叉搜索树,我们可以利用其特性来指导搜索过程,使之比一般的二叉树更高效。在二叉搜索树中,对于任何节点,其左子树中的所有节点都小于这个节点,而右子树中的所有节点都大于这个节点。

        基于这个性质,我们可以使用如下思路来进行查找:

  1. 从树的根节点开始搜索。
  2. 比较当前节点的值与目标值:
    • 如果当前节点的值等于目标值,那么我们找到了目标节点,返回这个节点即可。
    • 如果目标值小于当前节点的值,那么我们应该在左子树中继续搜索。
    • 如果目标值大于当前节点的值,那么我们应该在右子树中继续搜索。
  3. 如果当前节点是NULL,表示我们已经到达了叶子节点但未找到目标值,此时应该返回NULL。
  4. 重复以上步骤直到找到目标值或遍历到了叶子节点。

示例

        假设我们有如下的二叉搜索树结构:

        4/ \2   7/ \1   3

        现在让我们分两个示例来查找值为2的节点。

        示例一:查找值为2的节点

  1. 我们从根节点开始,也就是值为4的节点。
  2. 因为2小于4,我们向左子树移动。
  3. 现在我们在值为2的节点。我们比较当前节点的值(2)与目标值(2),发现它们相等。
  4. 我们找到了目标节点,并返回这个节点。

        函数返回包含值为2的子树的根,也就是:

    2/ \1   3

        示例二:查找值为5的节点

  1. 我们从根节点开始,也就是值为4的节点。
  2. 因为5大于4,我们向右子树移动。
  3. 现在我们在值为7的节点。因为5小于7,我们向左子树移动。
  4. 在值为7的节点处,并没有左子节点,所以我们到达了NULL。
  5. 我们没有找到目标节点,返回NULL。

梳理

        这样的实现能够工作,因为它依赖于二叉搜索树(Binary Search Tree, BST)的基本性质。在二叉搜索树中,每个节点都满足以下条件:

  1. 节点的左子树中的每个节点的值都小于当前节点的值。
  2. 节点的右子树中的每个节点的值都大于当前节点的值。
  3. 左子树和右子树也分别是二叉搜索树。

        这个性质允许我们使用二分查找的方法快速地在树中定位一个值是否存在。具体到 searchBST 函数中的实现:

  • 开始查找:我们从根节点开始查找。
  • 比较值:我们将目标值与当前节点的值进行比较。
    • 如果目标值与当前节点的值相等,我们就找到了需要的节点,返回它;
    • 如果目标值小于当前节点的值,根据二叉搜索树的性质,我们知道目标值(如果存在于树中)必定在当前节点的左子树中。因此,我们更新当前节点为其左子节点,继续查找;
    • 如果目标值大于当前节点的值,那么目标值(同样如果存在)一定在当前节点的右子树中。因此,我们更新当前节点为其右子节点,继续查找。
  • 终止条件:这个过程会一直进行,直到当前节点为空(这意味着目标值不存在于树中,返回 nullptr)或者找到了一个节点的值等于目标值(返回该节点)。

代码

#include <iostream> // 包含标准输入输出流的库using namespace std; // 使用命名空间std,省去std::前缀struct TreeNode { // 定义二叉树节点结构int val; // 节点存储的值TreeNode *left; // 指向左子树的指针TreeNode *right; // 指向右子树的指针TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} // 初始化构造函数,nullptr表示空指针
};TreeNode* searchBST(TreeNode* root, int val) { // 定义搜索二叉搜索树的函数while (root != nullptr && root->val != val) { // 当树不为空且当前节点值不等于目标值时root = val < root->val ? root->left : root->right; // 判断目标值是在左子树还是右子树}return root; // 返回找到的节点指针,如果没找到则是nullptr
}int main() { // 主函数TreeNode* root = new TreeNode(4); // 创建根节点,赋值为4root->left = new TreeNode(2); // 创建根的左子节点,赋值为2root->right = new TreeNode(7); // 创建根的右子节点,赋值为7root->left->left = new TreeNode(1); // 创建左子节点的左子节点,赋值为1root->left->right = new TreeNode(3); // 创建左子节点的右子节点,赋值为3int search_val = 2; // 设置要查找的值为2TreeNode* result = searchBST(root, search_val); // 调用搜索函数if (result != nullptr) { // 如果搜索结果不为空cout << "搜索到节点值为 " << search_val << " 的节点是:" << result->val << endl;if (result->left != nullptr) // 如果搜索到的节点的左子树不为空cout << "左子节点:" << result->left->val << endl; // 打印左子节点的值if (result->right != nullptr) // 如果搜索到的节点的右子树不为空cout << "右子节点:" << result->right->val << endl; // 打印右子节点的值} else { // 如果搜索结果为空cout << "未找到节点值为 " << search_val << " 的节点" << endl; // 表明没找到节点}search_val = 5; // 设置要查找的值为5result = searchBST(root, search_val); // 再次调用搜索函数if (result != nullptr) { // 如果搜索结果不为空cout << "搜索到节点值为 " << search_val << " 的节点是:" << result->val << endl;if (result->left != nullptr) // 如果搜索到的节点的左子树不为空cout << "左子节点:" << result->left->val << endl;if (result->right != nullptr) // 如果搜索到的节点的右子树不为空cout << "右子节点:" << result->right->val << endl;} else { // 如果搜索结果为空cout << "未找到节点值为 " << search_val << " 的节点" << endl; // 表明没找到节点}// 释放动态分配的内存(没写,懒)return 0; // 主函数结束,返回0
}  

        时间复杂度:O(n)

        空间复杂度:O(n)

打卡

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/463487.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fast.ai 深度学习笔记(四)

深度学习 2&#xff1a;第 2 部分第 8 课 原文&#xff1a;medium.com/hiromi_suenaga/deep-learning-2-part-2-lesson-8-5ae195c49493 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 来自 fast.ai 课程的个人笔记。随着我继续复习课程以“真正”理解它&#xff0c;这…

分享66个相册特效,总有一款适合您

分享66个相册特效&#xff0c;总有一款适合您 66个相册特效下载链接&#xff1a;https://pan.baidu.com/s/1jqctaho4sL_iGSNExhWB6A?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不…

DS:顺序栈的实现

创作不易&#xff0c;友友们给个三连吧&#xff01;&#xff01; 一、栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先…

在ComfyUI上安装动画生成插件Stable Video Diffusion

上一章节我们介绍了Stable video diffusion的安装及初步使用&#xff0c;我们发现SVD的运行需要较大的显存&#xff0c;但是如果将SVD作为插件安装在ComfyUI上面&#xff0c;发现ComfyUI可以很好的管理显存&#xff0c;同时配合ComfyUI的动画制功能&#xff0c;可以让应用更加丰…

Linux基础-配置网络

Linux配置网络的方式 1.图形界面 右上角-wired-配置 点加号-新建网络配置文件2.NetworkManager工具 2.1用图形终端nmtui 1.新建网络配置文件add 1.指定网络设备的类型Ethernet 2.配置网络配置文件的名称&#xff0c;名称可以有空格 3.配置网络配置文件对应的物理网络设备的…

腾讯云4核8g10M轻量服务器能承受多少人在线访问?

腾讯云轻量4核8G12M轻量应用服务器支持多少人同时在线&#xff1f;通用型-4核8G-180G-2000G&#xff0c;2000GB月流量&#xff0c;系统盘为180GB SSD盘&#xff0c;12M公网带宽&#xff0c;下载速度峰值为1536KB/s&#xff0c;即1.5M/秒&#xff0c;假设网站内页平均大小为60KB…

Axure RP9原型设计工具使用记录:实际应用及问题记录

Axure RP9使用记录二 &#x1f4da;第三章 实际应用&#x1f4d7;快速归位00坐标&#x1f4d7;动态菜单&#x1f4d7;填充图片&#x1f4d7;下拉框联动&#x1f4d7;单选框&#x1f4d7;全局变量 ⁉️问题记录❓问题一&#xff1a;菜单不显示❗解决方式&#xff1a;调整菜单元件…

15.3 Redis入门(❤❤❤❤)

15.3 Redis入门❤❤❤❤ 1. redis简介与配置1.1 简介1.2 Windows安装1.3 Linux安装1.4 守护进程方式启动1.5 客户端启动与使用1.6 指定生成日志 2. 使用2.1 客户端redis使用命令2.2 redis存储的数据类型1. String字符串类型2. Hash键值类型3. List列表类型4. Set与Zset集合类型…

【IDEA】新建Spring Initializr项目,选择java版本只有是17和21问题的解决方法

新建Spring Initializr项目时&#xff0c;选择java版本只有是17和21 2. 将https://start.spring.io修改为阿里云的服务器路径&#xff1a;https://start.aliyun.com 能够选择Java8、11等版本

知名开发工具RubyMine全新发布v2023.3——支持AI Assistant

RubyMine 是一个为Ruby 和 Rails开发者准备的 IDE&#xff0c;其带有所有开发者必须的功能&#xff0c;并将之紧密集成于便捷的开发环境中。 RubyMine v2023.3正式版下载 新版本改进AI Assistant支持、Rails应用程序和引擎的自定义路径、对Rails 7.1严格locals的代码洞察、RB…

2024初始Spring(并使用idea创建springweb项目)

前言 spring呢&#xff0c;以前一直是简单的了解&#xff0c;并没有利用空闲时间去进行对应的深入的学习&#xff0c;今天呢原本是打算好好学的&#xff0c;然后后来呢感觉还是太早了接触&#xff0c;打算把前面知识在过一编之后再开始 Spring介绍 Spring | Home 大家想要访…

微服务学习 | Spring Cloud 中使用 Sentinel 实现服务限流

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站https://www.captainbed.cn/kitie。 目录 前言 通过代码实现限流 定义资源 通过代码定义资源 通过注解方式定义资源 定义限流规则 通过…