【算法与数据结构】700、LeetCode二叉搜索树中的搜索

news2024/11/25 18:41:08

文章目录

  • 一、题目
  • 二、解法
  • 三、完整代码

所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。

一、题目

在这里插入图片描述

二、解法

  思路分析:二叉搜索树的性质:左节点键值 < 中间节点键值 < 右节点键值。那么我们根据此性质,对比目标值和中间节点,如果val值较小在左边子树进行搜索,否则在右边子树进行搜索。程序采用递归实现。
  程序如下

class Solution {
public:
    // 递归法
    // 1、输入参数
    TreeNode* searchBST(TreeNode* root, int val) { 
        // 2.终止条件
        if (root == NULL || root->val == val) return root;   // 找到目标值,标志位变为1,返回目标节点

        // 3.单层递归逻辑:对比根节点和val       
        if (root->val > val) return searchBST(root->left, val); // val较小,在左边子树            
        if (root->val < val) return searchBST(root->right, val); // val较大,在右边子树

        // 1.返回值
        return NULL;
    }
};

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

三、完整代码

# include <iostream>
# include <vector>
# include <string>
# include <queue>
# include <stack>
using namespace std;

// 树节点定义
struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode* left, TreeNode* right) : val(x), left(left), right(right) {}
};

class Solution {
public:
    // 递归法
    // 1、输入参数
    TreeNode* searchBST(TreeNode* root, int val) { 
        // 2.终止条件
        if (root == NULL || root->val == val) return root;   // 找到目标值,标志位变为1,返回目标节点

        // 3.单层递归逻辑:对比根节点和val       
        if (root->val > val) return searchBST(root->left, val); // val较小,在左边子树            
        if (root->val < val) return searchBST(root->right, val); // val较大,在右边子树

        // 1.返回值
        return NULL;
    }
};

// 前序遍历迭代法创建二叉树,每次迭代将容器首元素弹出(弹出代码还可以再优化)
void Tree_Generator(vector<string>& t, TreeNode*& node) {
    if (!t.size() || t[0] == "NULL") return;    // 退出条件
    else {
        node = new TreeNode(stoi(t[0].c_str()));    // 中
        if (t.size()) {
            t.assign(t.begin() + 1, t.end());
            Tree_Generator(t, node->left);              // 左
        }
        if (t.size()) {
            t.assign(t.begin() + 1, t.end());
            Tree_Generator(t, node->right);             // 右
        }
    }
}

template<typename T>
void my_print(T& v, const string msg)
{
    cout << msg << endl;
    for (class T::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << ' ';
    }
    cout << endl;
}

template<class T1, class T2>
void my_print2(T1& v, const string str) {
    cout << str << endl;
    for (class T1::iterator vit = v.begin(); vit < v.end(); ++vit) {
        for (class T2::iterator it = (*vit).begin(); it < (*vit).end(); ++it) {
            cout << *it << ' ';
        }
        cout << endl;
    }
}

// 层序遍历
vector<vector<int>> levelOrder(TreeNode* root) {
    queue<TreeNode*> que;
    if (root != NULL) que.push(root);
    vector<vector<int>> result;
    while (!que.empty()) {
        int size = que.size();  // size必须固定, que.size()是不断变化的
        vector<int> vec;
        for (int i = 0; i < size; ++i) {
            TreeNode* node = que.front();
            que.pop();
            vec.push_back(node->val);
            if (node->left) que.push(node->left);
            if (node->right) que.push(node->right);
        }
        result.push_back(vec);
    }
    return result;
}

int main()
{
    vector<string> t1 = { "4", "2", "1", "NULL", "NULL", "3", "NULL", "NULL", "7", "NULL", "NULL" };   // 前序遍历
    my_print(t1, "目标树");
    TreeNode* root1 = new TreeNode();
    Tree_Generator(t1, root1);
    vector<vector<int>> tree1 = levelOrder(root1);
    my_print2<vector<vector<int>>, vector<int>>(tree1, "目标树:");

    Solution s;
    int val = 2;
    TreeNode* root = s.searchBST(root1, val);
    vector<vector<int>> tree = levelOrder(root);
    my_print2<vector<vector<int>>, vector<int>>(tree, "目标树:");

    system("pause");
    return 0;
}

end

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Dice系数衡量图像分割中的重叠区域

学习目标 Dice系数和mIoU是均是语义分割的评价指标&#xff0c;今天这里就着重讲讲Dice系数&#xff0c;顺便提一下Dice Loss&#xff0c;以后有时间区分一下在语义分割中两个常用的损失函数&#xff0c;交叉熵和Dice Loss。 语义分割中评价指标的重要性 语义分割是计算机视…

Cannot read property ‘database‘ of undefined解决办法

PS&#xff1a;在最近项目部署的时候&#xff0c;后台遇到如下的报错&#xff0c;显示数据库未定义&#xff0c;研究了半天没有找到原因&#xff0c;但是能解决掉这个报错 TypeError: Cannot read property ‘database’ of undefined 我们查看下具体的文件目录 我们需要返回…

2023年人力资源服务行业研究报告

第一章 行业概况 1.1 定义 在2017年6月发布的《国民经济行业分类》文件中&#xff0c;人力资源服务行业被定义为提供劳动者就业和职业发展的相关服务&#xff0c;以及为雇主管理和开发人力资源的相关服务。这些服务主要包括人力资源招聘、职业指导、人力资源和社会保障事务代…

【1++的数据结构】之map与set(二)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的数据结构】 文章目录 一&#xff0c;前言二&#xff0c;红黑树的概念及其性质三&#xff0c;红黑树的插入四&#xff0c;红黑树的验证五&#xff0c;map与set的封装红黑树迭代器的实现map重载…

c语言flag的使用

flag在c语言中标识某种状态或记录某种信息&#xff0c;可以通过修改flag中来控制程序流程,判断某种状态是否存在或记录某种信息 操作:(1)初始化 (2)赋值 (3)判断 (4)修改 (5)去初始化 #include <stdlib.h>int power_state_check;int main() {int i 0;power_state_check…

统计命令汇总

适用于Unix体系 关于wc命令 Word Count 用于统计指定文件中的字节数、字数、行数&#xff0c;并将统计结果显示输出。 wc [-lcw] c 统计字节数 l 统计行数 m 统计字符数&#xff0c;此标志不能与-c标志一起使用 w 统计字数。一个字定义为由空白、跳格或换行字符分隔的字符串 统…

mysql数据库使用技巧整理

查看当前数据库已建立的client连接 > SHOW VARIABLES LIKE max_connections; -- 查看数据库允许的最大连接数&#xff0c;不是实时正在使用的连接数 > SHOW STATUS LIKE Threads_connected; -- 查看当前数据库client的连接数 > SHOW PROCESSLIST; -- 查看具体的连接

界面控件DevExtreme(v23.2)下半年发展路线图

在这篇文章中&#xff0c;我们将介绍DevExtreme在v23.2中发布的一些主要特性&#xff0c;这些特性既适用于DevExtreme JavaScript (Angular、React、Vue、jQuery)&#xff0c;也适用于基于DevExtreme的ASP. NET MVC/Core控件。 DevExtreme包含全面的高性能和响应式UI小部件集合…

论文翻译 : 风廓线对地面机载风能系统性能的影响

目录 摘要1 引言2. 风力条件2.2 风况2.3 风况聚类2.4 聚类分析2.5 聚类统计分析 3 引言 摘要 摘要&#xff1a;本研究通过确定基于现实垂直风速剖面的循环可行的功率优化飞行轨迹&#xff0c;来研究抽水模式地面生成的空中风能系统&#xff08;AWESs&#xff09;的性能。这些1…

基于Springcloud的基础框架,统一gateWay网关鉴权demo,附下载地址

基于Springcloud的基础框架&#xff0c;统一gateWay网关鉴权demo&#xff0c;附下载地址 使用方式&#xff1a; 1、搭建nacos环境&#xff0c;修改对应nacos地址 2、修改mysql地址,导入sql语句 ###框架内容 SpringcloudGatewayJWTNacosFeginmysqlMybatis plus 具体功能 基于…

基于Matlab实现多个图像融合案例(附上源码+数据集)

图像融合是将多幅图像合成为一幅图像的过程&#xff0c;旨在融合不同图像的信息以获得更多的细节和更丰富的视觉效果。在本文中&#xff0c;我们将介绍如何使用Matlab实现图像融合。 文章目录 简单案例源码数据集下载 简单案例 首先&#xff0c;我们需要了解图像融合的两种主…

Linux之修改服务端口号

本次演示以SSH服务为例&#xff0c;SSH默认监听端口是22,先保留了22端口&#xff0c;所以我们要进入ssh的配置文件添加新端口并注释或删掉原有端口。 1、使用vi编辑器修改文件 sshd_config,路径是/etc/ssh/sshd_config,找到“#Port 22”,添加新的端口号10086。 2、如果你关闭了…

2023开学礼中国海洋大学《乡村振兴战略下传统村落文化旅游设计》许少辉新海洋图书馆

2023开学礼中国海洋大学《乡村振兴战略下传统村落文化旅游设计》许少辉新海洋图书馆

建筑结构健康监测系统:智能监测建筑结构健康状况

大型公共建筑因其投资大、结构形式复杂、建设工期长、施工工艺复杂、使用年限长等特点。在使用期间受超常荷载、材料老化、构件缺陷等因素的作用&#xff0c;结构将逐渐产生损伤累积&#xff0c;从而使结构的承载能力降低&#xff0c;抵抗自然灾害的能力下降。如遇地震、台风等…

【解决】uniapp项目集成钉钉H5微应用,控制台提示 ReferenceError: dd is not defined

【问题】 在钉钉APP内集成H5微应用&#xff0c;跳转到内部应用&#xff0c;按照钉钉开放平台文档引入钉钉客户端SDK。 引入成功&#xff0c;运行项目&#xff0c;调用dd.getAuthCode()方法获取免登授权码&#xff0c;控制台显示 “ReferenceError: dd is not defined” 【解决…

计算机组成原理学习记录(更新中)

文章目录 仅做个人记录计组的学习中认为容易记错的点或是个人认为的要点&#xff0c;如有错误&#xff0c;请多包涵。 学习资源为b站网课&#xff1a;王道计算机考研 计算机组成原理 大部分图片来自该网课 &#xff08;1&#xff09;冯诺依曼型计算机由五个部分组成&#xff…

【快应用】快应用与网页通信踩坑合集处理

【关键词】 Web、postMessage、onMessage 【问题背景】 快应用中通过web组件加载的h5网页&#xff0c;快应用在和网页进行通信时&#xff0c;经常会遇到网页发送信息给快应用&#xff0c;快应用成功收到&#xff0c;反过来的时候&#xff0c;h5网页就没法收到了。如提示 xxx …

Spark2x原理剖析(二)

一、概述 基于社区已有的JDBCServer基础上&#xff0c;采用多主实例模式实现了其高可用性方案。集群中支持同时共存多个JDBCServer服务&#xff0c;通过客户端可以随机连接其中的任意一个服务进行业务操作。即使集群中一个或多个JDBCServer服务停止工作&#xff0c;也不影响用…

SSRF服务端请求伪造

服务端请求伪造&#xff0c;其实就是攻击者构造恶意请求&#xff0c;服务端发起恶意请求&#xff0c;如果服务端不对用户传递的参数进行严格的过滤和限制&#xff0c;就可能导致服务端请求伪造 上面是百度识图&#xff0c;我们可以传递图片地址&#xff0c;百度识图向图片发起…

Linux内核源码分析 (7)内核内存布局和堆管理

一、Linux内核内存布局 64位Linux一般使用48位来表示虚拟地址空间&#xff0c;45位表示物理地址。通过命令&#xff1a;cat/proc/cpuinfo。查看Linux内核位数和proc文件系统输出系统软硬件信息如下: lhLH_LINUX:~$ cat /proc/cpuinfo vendor_id : GenuineIntel // CPU制造商 cp…