Leetcode:98. 验证二叉搜索树(C++)

news/2024/11/7 10:41:54/

目录

问题描述:

实现代码与解析:

递归:

 原理思路:

迭代(中序):

思路原理:


问题描述:

        给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

输入:root = [2,1,3]
输出:true

示例 2:

输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。

实现代码与解析:

递归:

class Solution {
public:void traversal(TreeNode* root,vector<int>& vec){if(root==NULL) return;traversal(root->left,vec);vec.push_back(root->val);//中序traversal(root->right,vec);}bool isValidBST(TreeNode* root) {vector<int> vec;traversal(root,vec);for(int i=1;i<vec.size();i++){//搜索树种也不能有相同元素,所以有等于号if(vec[i-1]>=vec[i]) return false; }return true;}
};

 原理思路:

        根据二叉搜索树的性质,我们中序遍历转化出来的数组一定是单调递增的且没有重复元素,代码是很好写出的。

        当然也可以不用数组,直接在递归时判断出来是否有序。下面给出代码:

class Solution {
public:long max=LONG_MIN;bool isValidBST(TreeNode* root) {if(root==NULL) return true;bool left=isValidBST(root->left);if(root->val>max) max=root->val;//更新最大值else return false;//若不递增,不用再向右遍历了直接返回falsebool right=isValidBST(root->right);return left&&right;}
};

        这题测试数据中有INT_MIN,所以这里我们用LONG_MIN,当然如果这里测试数据有最小的LLONG_MIN,无法找出比它还小的值,那我们就换一种方式来比较,记录前一个结点值来判断即可:

class Solution {
public:TreeNode* pre = NULL; // 用来记录前一个节点bool isValidBST(TreeNode* root) {if (root == NULL) return true;bool left = isValidBST(root->left);//当pre不为空if (pre != NULL && pre->val >= root->val) return false;pre = root; //记录前一个结点bool right = isValidBST(root->right);return left && right;}
};

        其实第一次看这个题,我想的是比较左右子树与根结点的值大小来判断返回,就像这样:

if(root->val<=root->left->val||root->val>=root->right->val) return false;

        后来发现,其实这样是错误的,这样只判断左右子树的根节点,而二叉搜索树是左子树所有结点都小于根结点,右子树的所有结点都大于根节点,所以不能这样写。

迭代(中序):

class Solution {
public:bool isValidBST(TreeNode* root) {stack<TreeNode*> st;TreeNode* pre=NULL;while(root!=NULL||!st.empty()){if(root!=NULL){st.push(root);root=root->left;}else{root=st.top();st.pop();if(pre!=NULL&&root->val<=pre->val) return false;pre=root;//保存结点root=root->right;}}return true;}
};

思路原理:

        在中序遍历的代码上做一定修改即可。


http://www.ppmy.cn/news/11503.html

相关文章

Trime同文输入法JNI加载过程

Trime同文输入法JNI加载过程JNI初始化顺序第一步、加载librime_jni.so库第二步、自动注册机制第三步、正式加载librime_jni.so库插入一个话题、简化打印记录第四步、执行Rime.java中的init()方法LoadModules()LoadModule()rime_core_initialize()调用顺序Class不是class关键字&…

一网打尽链表的经典OJ题!链表必考笔试题第二弹

目录 0.前言 1.合并两个排序链表 1.1 实用小妙招 1.2代码书写 2.链表分割 3.链表的回文结构 4.相交链表 4.1 实用小妙招&#xff08;假定指针法&#xff09; 4.2代码书写 5. 复制带随机指针的链表 0.前言 本文代码及分析图片资源都以上传Gitee&#xff0c;可自取&a…

SpringBoot+Vue项目在线拍卖系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏…

整理了一周近万字讲解linux基础开发工具vim,gdb,gcc,yum等的使用

文章目录 前言一、yum的使用二、vim的使用三 . gcc/g的使用四 . gdb的使用总结前言 想用linux开发一些软件等必须要会的几种开发工具是必不可少的&#xff0c;在yum vim gcc gdb中指令繁杂的是vim和gdb这两个工具&#xff0c;至于yum和gcc的指令就比较简单了。 一、yum的使用…

System Description 步骤

纲要&#xff1a; 在有了Composition以后&#xff0c;下一步就是把它分配到ECU里面。 1. Create System Description Import DBC file, select ECUs and CAN Frames under the DBC. Then it will create "SystemDescription.arxml" file. [1] 2. Check the content…

23. 反爬案例:不登录不给,要数据请先登录我的站点

登录之后&#xff0c;可以查看数据&#xff0c;是部分站点常用规则&#xff0c;本篇博客将在爬虫训练场中实现该需求。 文章目录安装必备模块建立 models建立 login_form 表单文件flask_wtf 中 FlaskForm 类建立登录视图函数配置 login.html 页面安装必备模块 实现 Python Fla…

springboot:接手老项目,领导让更新数据库说明文档,如何3分钟完成任务

0 引言 最新在重新整理老项目的文档&#xff0c;其中数据库说明文档上一版更新还是在1年多前&#xff0c;文档中的数据结构说明与当前数据库严重脱节&#xff0c;所以更新数据库说明文档已经是迫在眉睫的事情了。 因为项目是一个比较大型且“年长‘的项目&#xff0c;涉及了多…

Java异常情况了解

作者&#xff1a;爱塔居的博客_CSDN博客-JavaSE,数据结构领域博主 专栏&#xff1a;JavaSE 作者介绍&#xff1a;大三学生&#xff0c;希望一起进步~ 文章目录 目录 文章目录 一、异常结构体系 二、异常分类 三、异常处理 3.1异常抛出 3.2 异常捕获 四.【面试题】 五、题目练习…