LeetCode 98 验证二叉搜索树(二叉搜索树的中序遍历为递增)

2023-10-27

题目:

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

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

示例 1:

输入:
    2
   / \
  1   3
输出: true

示例 2:

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

起初按照题目定义写出代码如下:

class Solution {
public:
    bool isValidBST(TreeNode* root) {
       if(root!=NULL){
			int flag = 0;
			BST_dfs(root,flag);
			if(flag)
				return false;
			else
				return true;
		}
		else
			return true;
    }
    
    void BST_dfs(TreeNode* root,int &flag){
		if(root->left==NULL&&root->right==NULL)
			return;
		if(root->left!=NULL){
			if(root->val < root->left->val){
				flag = 1;
				return;
			}	
			BST_dfs(root->left,flag);
		}
		if(root->right!=NULL){
			if(root->val > root->right->val){
				flag = 1;
				return;
			}	
			BST_dfs(root->right,flag);
		}
	}
};

这种写法忽略了如下情况:那就是6本应在二叉树的左子树却在右子树,但是上述代码每次只能判断一个节点和他左右两个节点是否满足要求;后面,看评论说二叉搜索树的中序遍历为递增,因此可利用这一方法进行判断。代码改写如下:

    10
   / \
  5   15
     / \
    6  20
struct TreeNode{
	int val;
	TreeNode* left;
	TreeNode* right;
	TreeNode(int x):val(x),left(NULL),right(NULL){}
};

class Solution{
public:
	bool isValidBST(TreeNode* root){
		vector<int> ch;
		if(root==NULL) return true;
		else{
			order_BST(root,ch);
			if(ch.size()==1)
				return true;
			for(int i=0;i<ch.size()-1;i++){
				if(ch[i]>=ch[i+1]) 
					return false;
			}
			return true;
		}
	}

	void order_BST(TreeNode* root, vector<int>& vec){
		if(!root)
			return;
		order_BST(root->left,vec);
		vec.push_back(root->val);
		order_BST(root->right,vec);
	}
};

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode 98 验证二叉搜索树(二叉搜索树的中序遍历为递增) 的相关文章

  • 如何在Android/鸿蒙上安装XAPK文件

    How to install XAPK APK file On Android apkpure com 如何在Android 鸿蒙上安装XAPK文件 什么是XAPK文件 XAPK文件最初由APKPure创建 它是一个文件扩展名 包含单独的A
  • 文献管理软件 Zotero

    在众多文献管理软件中 Zotero以其开源的特征独树一帜 如果不能说是最好用的软件 也绝不出前三名 Zotero网址 Your personal research assistant Zotero插件 https www zotero or
  • 面向对象练习【Python】

    1 定义一个汽车类 Car 属性有颜色 品牌 车牌号 并实例化两个对象 class Car def init self color brand num self color color self brand brand self num n
  • golang websocket压测示例

    package main import flag fmt log net url time github com gorilla websocket 根据自身情况修改服务器ip地址 var addr flag String addr loc
  • 【刷题笔记6】LeetCode 162. 寻找峰值(二分查找优化)

    用分享的方式成长 用有趣的眼光看世界 欢迎来到12 26 25的博客 热爱编码 算法 知识总结 不定期更新有趣 有料 有营养内容 让我们共同学习 共同进步 系列索引 刷题笔记0 系列目录索引 持续更新 推荐收藏 本题题目 LeetCode
  • 构建跨平台应用的利器——UniApp入门级开发小实战

    文章目录 待办事项列表应用 1 创建项目和页面 2 设置路由 3 编写主页 4 编写任务详情页 5 完善导航功能 6 运行项目 天气预报应用 1 创建项目和页面 2 设置路由 3 编写主页 4 编写天气详情页 5 完善导航功能 6 运行项目
  • (10)QWidget的使用(one)

    目录 QWidget的大小和位置 获取QWidget的大小和位置 设置QWidget的大小和位置 设置窗口固定大小 限定窗口的大小 坐标系统转换 内容边距 鼠标指针 鼠标指针的形状 自定义光标的使用 获取和设置光标的坐标 QWidget类是
  • jdbcURL连接参数

    jdbc mysql 192 168 0 105 3306 shgb fz useUnicode true characterEncoding UTF8 autoReconnect true zeroDateTimeBehavior con
  • 设计模式-状态模式的简单实现

    状态模式包括以下几种角色 Context 状态持有类 它定义了客户程序需要的接口并维护一个具体状态角色的实例 将与状态相关的操作委托给当前的Concrete State对象来处理 State 抽象状态类 定义一个接口以封装使用上下文环境的的
  • 1000行Python代码实现五个小游戏,愁死人系列....

    Python开发小游戏 它有又双叒叕来了 一 效果展示 1 俄罗斯方块 2 扫雷 3 五子棋 4 贪吃蛇 害 这个是最惊心动魄的 为了我的小心脏 不玩了不玩了 二 代码展示 https jq qq com wv 1027 k SFu7oNI
  • 坐标计算公式

    直线 x x 0 L
  • 稳压二极管的原理,它有什么作用?

    对于从事硬件设计的工作者来说 稳压管应该是我们在项目中最常用的器件之一了 稳压二极管 其又被称为齐纳二极管 其在电路中起稳定电压的作用 利用二极管被反向击穿后 在一定反向电流范围内反向电压不随反向电流变化一特点进行稳压的 与普通二极管最大区
  • 分享四个一键生成神器:Logo、App、小程序、H5等五分钟快速搞定

    第一个 Logo生成器 www logaster cn 一个logo修正一二十遍依然定不了 那么就用这个网站 简单的操作 依照提示就能一步步本人搞定logo 而且开能够输入关键词 自动生成logo 第二个 二维码生成器 https cli
  • np.diag()函数

    nunpyp diag 调用方法 numpy diag v k 0 各个参数意义 v 如果v是一个2维数组 就会返回这个二维数组中第k个对角线上值新组成的一维数组 如果v是一维数组 返回一个二维数组 其中v处于第k个对角线上 k 可选参数
  • 设计模式Java实战

    文章目录 一 前置 1 1 目的 1 2 面向对象 1 3 接口和抽象类 二 七大设计原则 2 1 单一职责 2 2 接口隔离原则 2 3 依赖倒转原则 2 4 里氏替换原则 2 5 开闭原则 2 6 不要重复原则 2 7 迪米特最少知道法
  • layui - 重载和刷新表格时保持在当前页码 - 获取当前数据所在的页码 和 显示条数

    感谢大佬 转载文章自己存档 https blog csdn net COCOLI BK article details 88417605 layui laypage em next html 当前页码值 layui laypage limi
  • Android显示系统 SurfaceFlinger内部机制 3 APP申请创建Surface的过程

    韦东山 笔记 3 APP申请创建Surface的过程 看看Surface test的过程 1 获取SF服务 2 创建Surface 3 得到buffer 4 写buffer 5 回顾下获取SF服务过程 AP获取SF服务 调用createCo
  • C++获取当前时间 (std::chrono)

    在C 11之前要获取当前时间 大多数情况下要使用C语言的time库 include

随机推荐

  • vue.config.js文件配置devServer和devServer.proxy多个代理地址

    如何在vue config js文件配置属性devServer和devServer proxy配置多个代理地址 如下所示 比如 封装请求方法格式 可以略过 module exports outputDir dist 打包后输出文件名称 以及
  • vue-amap 定位和逆解码

    1 安装 npm install vue amap save 2 main js引入 import VueAMap from vue amap Vue use VueAMap VueAMap initAMapApiLoader key ke
  • 向量与矩阵的相乘

    向量与矩阵的相乘 2016年07月31日 10 00 55 阅读数 2253 在学习计算机图形学的时候 最常遇到的就是矩阵的乘法了 下面我们就简单的介绍下 使用程序如何编写两个矩阵的相乘呢 其实这个问题 大一的孩子都会写的 不是很难的 但是
  • 【文本信息处理】网络文本访问和处理+分词

    一 网络文本访问和处理 1 re findall 返回string中所有与pattern匹配的全部字符串 返回形式为数组 def findall pattern string flags 0 Return a list of all non
  • unity 实现Android端视频在UI上播放

    之前unity实现在RawImage上播放视频主要是通过movieTexture 而现在这个方法已经被抛弃 采用VideoPlayer来实现 实现的原理是将VideoPlayerd的视频渲染到UGUI的RawImage上 private V
  • 【C++拾遗之八】#pragmaonce与#ifndef的用法总结

    宏定义 一 两种宏定义的功能 二 两种宏定义的用法 三 两种宏定义的区别 一 两种宏定义的功能 ifndef 和 pragma once都是C C 中的两种宏定义 它们的作用是为了避免同一个头文件被多次包含 include note 只能保
  • Nginx入门笔记

    目录 Nginx 快速入门 1 启动 停止和重新加载 Nginx 配置 2 配置文件的结构 3 提供静态内容服务 静态网站 4 设置简单的代理服务器 5 设置 FastCGI 代理 Nginx 进程和运行时控制 1 主进程和工作进程 2 控
  • idea 配置(下载) golang 环境 GOROOT、GOPATH

    windows 10 平台 golang镜像下载地址 https gomirrors org 选择稳定版的windows amd64 msi或者zip zip 解压到目录即可 msi 打开直接安装 配置环境变量 高版本有的会自己配置环境变量
  • [定向爬虫] 网络爬虫实例2-淘宝定向爬虫

    import requests import re import time 获取html页面 def getHTMLText url try r requests get url timeout 30 r raise for status
  • 【雕爷学编程】MicroPython手册之 WiPy 特定端口库 wipy.machine.I2C.stop()

    MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器 与常规Python相比 MicroPython解释器体积小 仅100KB左右 通过编译成二进制Executable文件运行 执行效率较高 它使用
  • 一文了解电商大促系统的高可用保障思路

    本文面向受众可以是运营 可以是产品 也可以是研发 测试人员 作者希望通过如下思路 知历史 gt 清家底 gt 明目标 gt 定战略 gt 做战术 gt 促成长 帮助大家能够了解电商大促系统的高可用保障 减少哪些高深莫测的黑话和高大尚的论调
  • 【linux】linux中fork()详解(实例讲解)

    目录 linux中fork 函数详解 从一道面试题谈linux下fork的运行机制 linux中fork 函数详解 原文 linux中fork 函数详解 原创 实例讲解 jason314的博客 CSDN博客 fork 函数 一 fork入门
  • Conda 创建和删除虚拟环境

    1 检验当前conda的版本 conda V 2 conda常用的命令 查看已有的虚拟环境 conda env list 创建虚拟环境和删除虚拟环境 anaconda命令创建python版本为x x 名字为env name的虚拟环境 env
  • 微信小程序授权获取头像昵称的最新形式——头像昵称填写

    微信小程序授权用户信息 不知道有没有人像我一样 从wx getUserInfo到wx getUserProfile再到头像昵称填写获取用户头像昵称全部尝试了一遍 怪就怪自己一开始没仔细看官方文档 没注意到小程序的官方公告 不多说了 整理一下
  • LCD图片显示、触摸屏、音乐播放、缩放图片和播放视频

    一 GEC6818开发板的LCD 1 LCD 1 原理 LCD屏幕是由一个个像素组成的 横向像素个数和纵向像素个数是LCD的一个重要指标 称为像素分辨率 当前举例开发板的分辨率是 800X480 LCD显示从屏幕左上角的像素开始 直到右下角
  • C0223 [2015普及组-B]扫雷游戏-C语言写

    题目描述 扫雷游戏是一款十分经典的单机小游戏 在n行m列的雷区中有一些格子含有地雷 称之为地雷格 其他格子不含地雷 称之为非地雷格 玩家翻开一个非地雷格时 该格将会出现一个数字 提示周围格子中有多少个是地雷格 游戏的目标是在不翻出任何地雷格
  • wget命令详解,断点续传

    1 支持断点下传功能 2 同时支持FTP和HTTP下载方式 3 支持代理服务器 4 设置方便简单 5 程序小 完全免费 wget虽然功能强大 但是使用起来还是比较简单的 基本的语法是 wget 参数列表 URL 下面就结合具体的例子来说明一
  • CSDN新星计划/原力计划来喽,对此你有何期待

    文章目录 写在前面 新星计划 独自开 原力计划 横穿全年的计划 写在最后 写在前面 哈喽 大家好 我是几何心凉 这是一份全新的专栏 得到CSDN王总的授权 来对于我们每周四的绿萝时间 直达CSDN 直播内容进行总结概括 让大家能够省去看直播
  • 【虚幻】在UE4使用c++的Timeline和Curve制作动画

    文章目录 虚幻 在UE4使用c 的Timeline和Curve制作动画 动画的必备要素 Curve Timeline 调用流程 代码示例 虚幻 在UE4使用c 的Timeline和Curve制作动画 想用c 在UE4里面写一个动画 Goog
  • LeetCode 98 验证二叉搜索树(二叉搜索树的中序遍历为递增)

    题目 给定一个二叉树 判断其是否是一个有效的二叉搜索树 假设一个二叉搜索树具有如下特征 节点的左子树只包含小于当前节点的数 节点的右子树只包含大于当前节点的数 所有左子树和右子树自身必须也是二叉搜索树 示例 1 输入 2 1 3 输出 tr