代码随想录算法训练营第27天|二叉搜索树、LeetCode700.二叉搜索树中的搜索、LeetCode98.验证二叉搜索树

news2024/12/27 18:47:30

代码随想录算法训练营第27天|二叉搜索树、LeetCode700.二叉搜索树中的搜索、LeetCode98.验证二叉搜索树

1、二叉搜索树

二叉搜索树是一个有序树:

  • 若它的左子树不空,则子树上所有结点的值均于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉搜索树

这就决定了,二叉搜索树,递归遍历和迭代遍历和普通二叉树都不一样。

如:

700.二叉搜索树中的搜索

2、LeetCode700.二叉搜索树中的搜索

700. 二叉搜索树中的搜索 - 力扣(LeetCode)

第一想法(递归法)

就是递归遍历二叉搜索树

代码
class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        // 空,不存在
        if(!root)   return NULL;
        // 找到
        if(root->val == val)   return root;
        // 递归去找
        if(val < root->val)
            return searchBST(root->left, val);
        if(val > root->val)
            return searchBST(root->right, val);
        return NULL;
    }
};
迭代法

一提到二叉树遍历的迭代法,可能立刻想起使用栈来模拟深度遍历,使用队列来模拟广度遍历。对于二叉搜索树可就不一样了,因为二叉搜索树的特殊性,也就是节点的有序性,可以不使用辅助栈或者队列就可以写出迭代法。

对于一般二叉树,递归过程中还有回溯的过程,例如走一个左方向的分支走到头了,那么要调头,在走右分支。而对于二叉搜索树,不需要回溯的过程,因为节点的有序性就帮我们确定了搜索的方向。

代码

OMG…居然这么短这么简单…

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        // 法2 迭代
        while(root){
            if(val < root->val) root = root->left;
            else if(val > root->val)    root = root->right;
            else return root;
        }
        return root;
    }
};

3、LeetCode98.验证二叉搜索树

98. 验证二叉搜索树 - 力扣(LeetCode)

第一想法

递归地验证。

代码

噢居然一遍过了!!!噢不…额外的测试用例没过,看来是跳进陷阱里面去了

class Solution {
public:
    bool isValidBST(TreeNode* root) {
        if(root == NULL)    return true;
        // 判断左右节点是否符合
        bool left = true;
        bool right = true;
        //左子树
        if(root->left){
            //左节点是否符合
            if(root->left->val >= root->val)
                left = false;
            else
                //左节点合格,左子树是否合格
                left = isValidBST(root->left);
        }
      	//右子树
        if(root->right){
            if(root->right->val <= root->val)
                right = false;
            else
                right = isValidBST(root->right);
        }
      	//左右同时合格才行
        return left && right;
    }
};

犯错的情况:

6比10小,但是却在10的右子树上。

二叉搜索树

解题思路(递归法)

代码随想录 (programmercarl.com)

中序遍历下,输出的二叉搜索树节点的数值是有序序列。有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。

代码:

中序遍历,存入数组。最后判断数组是否是递增的。

class Solution {
private:
    vector<int> vec;
    void traversal(TreeNode* root) {
        if (root == NULL) return;
        traversal(root->left);
        vec.push_back(root->val); // 将二叉搜索树转换为有序数组
        traversal(root->right);
    }
public:
    bool isValidBST(TreeNode* root) {
        vec.clear(); // 不加这句在leetcode上也可以过,但最好加上
        traversal(root);
        for (int i = 1; i < vec.size(); i++) {
            // 注意要小于等于,搜索树里不能有相同元素
            if (vec[i] <= vec[i - 1]) return false;
        }
        return true;
    }
};

还有另外的写法以及迭代法,但是短时间内没看懂,先掌握这一种,下次再来看(代码随想录的网站上)

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

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

相关文章

东方博宜 1749. 有哪些闰年

东方博宜 1749. 有哪些闰年 #include<iostream> using namespace std; int main() {int n ; cin >> n ;int cnt ;cnt 0 ;for(int i 1900 ; i < n ; i){if((i%40 && i%100! 0) || (i%4000))cnt 1 ;}cout << cnt ;return 0 ; }

aws使用记录

数据传输&#xff08;S3) 安装命令行 安装awscli: https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/getting-started-install.html#getting-started-install-instructions 直到 aws configure list 可以运行 身份验证&#xff1a; 运行&#xff1a; aws config…

辽渤湾海现已加入2024第七届燕窝天然滋补品博览会

参展企业介绍 大连辽渤湾海产品有限公司&#xff0c;是一家主营海参、鲍鱼、海胆等大连海产品的加工和销售的综合型水产企业&#xff0c;拥有国内精良的整条加工流水线&#xff0c;拥有上千平米的现代化加工办公场地的现代化企业。现已发展成为大连海参产品的主导型深加工基地。…

【学习】软件测试中误区汇总分析

大家有没有想过这个问题&#xff1a;软件测试中有哪些误区呢&#xff1f;想起这个题目&#xff0c;是因为最近遇到好几次关于这方面的讨论。发觉即便做过几年测试的老员工也或多或少有些这方面的困惑。当然一家之言&#xff0c;仅作抛砖引玉之谈。 误区一&#xff1a;测试就是…

C语言二叉树和堆(个人笔记)

二叉树和堆 二叉树1二叉树的概念和结构1.1特殊的二叉树1.2二叉树的性质&#xff08;规定根节点的层数为1&#xff09;1.3二叉树的存储结构 2.二叉树的顺序结构和实现2.1二叉树的顺序结构2.2堆的概念和结构2.3堆的实现2.4堆的应用2.4.1堆排序 2.5TOP-K问题 3.二叉树的遍历4.二叉…

已注册的商标别忘了续展,新注可能难下证!

近期普推知产老杨遇到好几个网友和看过多个案例&#xff0c;以前商标名称可以申请注册下来&#xff0c;但是换字体注册不下来了&#xff0c;有的是不想续展想直接换字体申请注册&#xff0c;但是也没有下来。 这些商标名称主要是存在禁止注册或缺显&#xff0c;比如“柳林”以前…

新手如何去做性能测试?

1、性能测试是什么&#xff1f; 一句话概括&#xff1a;不断的通过不同场景的系统表现去探究系统设计与资源消耗之间的平衡。 具体一点&#xff1a;通过在测试环境下对系统或构件的性能进行探测&#xff0c;用以验证在生产环境下系统性能是否达到预估的性能需求&#xff0c;发…

C++:单行注释和多行注释(2)

注释是什么&#xff1a;在们写代码的时候&#xff0c;往往光靠理解去看代码&#xff0c;是效率非常低的&#xff0c;这时我们就可以使用注释对代码进行一个解读&#xff0c;即使后期别人拿了你的代码&#xff0c;他通过看注释就可以快速理解你的代码的意思&#xff0c;在执行代…

基于MATLAB的模糊神经网络预测水质评价

%% 学习目标&#xff1a;模糊神经网络预测水质评价 %% 更多matlab精彩专题课程和案例&#xff0c;可以搜索微信公众号&#xff1a;电击小子程高兴的MATLAB小屋 %% 清空环境变量 clc clear%% 参数初始化 xite0.001; alfa0.05;%% 网络节点 I6; %输入节点数 M12; %隐含节点数…

【tingsboard开源平台】环境准备和安装

文章目录 环境准备:1.安装JAVA2.安装maven环境3.安装nodeJS(16.15.1)4.安装git环境5.安装npm依赖关系6.放入文件fetched7.安装IDEA 环境准备: 1.安装JAVA 以安装java11为例&#xff0c;安装tingsboard需要的jdk 下载地址&#xff1a;https://www.oracle.com/java/technologi…

深入理解Vue的生命周期机制

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

快速幂算法在Java中的应用

引言&#xff1a; 在计算机科学和算法领域中&#xff0c;快速幂算法是一种用于高效计算幂运算的技术。在实际编程中&#xff0c;特别是在处理大数幂运算时&#xff0c;快速幂算法能够显著提高计算效率。本文将介绍如何在Java中实现快速幂算法&#xff0c;并给出一些示例代码和应…

Linux——信号概念与信号产生方式

目录 一、概念 二、前台进程与后台进程 1.ctrlc 2.ctrlz 三、信号的产生方式 1.键盘输入产生信号 2.系统调用发送信号 2.1 kill()函数 2.2 raise()函数 2.3 abort()函数 3.异常导致信号产生 3.1 除0异常 3.2 段错误异常 4.软件条件产生信号 4.1 管道 4.2 闹钟…

浮动布局与定位布局

目录 前言: 浮动布局&#xff08;Float Layout&#xff09;: 定位布局&#xff08;Positioning Layout&#xff09;: 1.传统布局: 1.1文档流布局: 1.1.1基本的布局方式: 1.1.2 块级元素: 1.1.3调整元素: 1.2浮动布局: 1.2.1浮动布局允许元素向左或向右浮动&#xff0c;使…

开发面试相关的编程题

1,【求数字1出现的次数】 问题描述: 输入一个整数n&#xff0c;求从1到n这n个整数(十进制)中1出现的次数。要求空间复杂度为O(n)。 输入描述: 1 输入的数据包含一行&#xff1a; 整数N&#xff0c;要求N>1 输出描述: 1 输出一个整数&#xff0c;表示从1到N这N个…

SQLServer CONCAT 函数的用法

CONCAT函数用于将多个字符串值连接在一起。以下是一个简单的示例&#xff0c;演示了如何使用CONCAT函数&#xff1a; -- 创建一个示例表 CREATE TABLE ExampleTable (FirstName NVARCHAR(50),LastName NVARCHAR(50) );-- 插入一些示例数据 INSERT INTO ExampleTable (FirstNam…

【晴问算法】入门篇—递归—数塔

题目描述 数塔就是由一堆数字组成的塔状结构&#xff0c;其中第一行1个数&#xff0c;第二行2个数&#xff0c;第三行3个数&#xff0c;依此类推。每个数都与下一层的左下与右下两个数相连接。这样从塔顶到塔底就可以有很多条路径可以走&#xff0c;现在需要求路径上的数字之和…

《仙剑7》登陆Xbox主机平台年末大作空窗期

首发一年后&#xff0c;《仙剑奇侠传7》终于登陆Xbox主机平台&#xff0c;而这也恰逢Xbox平台年末大作的窗口期。 随着年底大作的稀缺&#xff0c;以及海外3A RPG《星空》的延期&#xff0c;2022年底的这段时间给Xbox玩家体验《刀剑7》留下了一段空白。 可以说是因祸得福。 《仙…

白板手推公式性质 AR模型 时间序列分析

白板手推公式性质 AR模型 时间序列分析 视频讲解&#xff1a;https://www.bilibili.com/video/BV1D1421S76v/?spm_id_from.dynamic.content.click&vd_source6e452cd7908a2d9b382932f345476fd1 B站对应视频讲解(白板手推公式性质 AR模型 时间序列分析)

鸿蒙HarmonyOS应用开发之Node-API常见问题

ArkTS/JS侧import xxx from libxxx.so后&#xff0c;使用xxx报错显示undefined/not callable 排查.cpp文件在注册模块时的模块名称与so的名称匹配一致。 如模块名为entry&#xff0c;则so的名字为libentry.so&#xff0c;napi_module中nm_modname字段应为entry&#xff0c;大小…