当前位置: 首页 > news >正文

《程序员面试金典(第6版)》面试题 04.05. 合法二叉搜索树

题目描述

实现一个函数,检查一棵二叉树是否为二叉搜索树。

示例 1:
输入:

    2/ \1   3

输出: true

示例 2:
输入:

    5/ \1   4/ \3   6

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

解题思路与代码

使用额外数据结构 + 中序遍历

这应该是最简单,并且最容易理解的一种做法了。
由二叉搜索树的性质可知,二叉搜索树的左边节点小于中间节点,中间节点小于右边节点。由这一特性我们可以得知,二叉搜索树的中序遍历是一个有序的数组。

我们只需要检查这个数组是否有序,就能判断出这个二叉树是否是二叉搜索树。

具体实现请看代码:

/*** Definition for a binary tree node.* 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> result;inorderTraversal(root,result);int size = result.size();for(int i = 1; i < size; ++i )if(result[i-1] >= result[i]) return false;return true;}void inorderTraversal(TreeNode* root,vector<int>& vec){if(root == nullptr) return ;inorderTraversal(root->left,vec);vec.push_back(root->val);inorderTraversal(root->right,vec);}
};

在这里插入图片描述

复杂度分析

时间复杂度:O(n),n是这个二叉树的节点数目。我们要遍历这个二叉树的每一个节点。
空间复杂度:O(n),n是这个二叉树的节点数目,我们要将n个元素压入vector中。此外,函数的递归调用会使用一定的系统栈空间,但是由于递归深度不会超过二叉树的高度,所以可以认为空间复杂度也是 O(n) 级别的。

中序遍历不使用额外数据结构

这种做法,就是稍稍的将我刚刚的那种做法升级了一下,我们使用一个前驱指针,去记录中序遍历的前一个节点。那么中序遍历是先遍历左子树然后遍历中间节点,再去遍历右子树的。所以我们只需要一直去判断,这个前驱指针的值是否一种小于中间节点的值就行了。

具体实现请看代码:

class Solution {
public:TreeNode* pre = nullptr;bool isValidBST(TreeNode* root) {if(root == nullptr) return true;if(!isValidBST(root->left)) return false;if(pre != nullptr && pre->val >= root->val) return false;pre = root;if(!isValidBST(root->right)) return false;return true;}
};

注意:这个代码中不太容易想出来的代码在于这一行:if(!isValidBST(root->left)) return false; 我们的递归逻辑是在这个if判断里面的。这个递归就会把我们一直带到左叶子节点。然后再逐层的返回判断。
在这里插入图片描述

复杂度分析:

时间复杂度:O(n),n为节点的个数。不管怎样我们都要遍历这个树中的所有节点。
空间复杂度:O(h),其中 h 是二叉树的高度。最坏情况下(即二叉树退化为链表时),递归调用深度达到 n,此时栈的空间复杂度为 O(n);平均情况下树的高度是 log n,空间复杂度是 O(log n)。

这个代码优化了空间复杂度,因为没有用到额外的数据结构。但是执行代码所需要的时间缺增加了。这是因为我们每次递归都要做许多的判断。而上一次的代码只需要在for循环里做少量判断就行了。

总结

这道题不算太难。只要能及时的想起二叉搜索树的性质,就能轻松解题。

相关文章:

《程序员面试金典(第6版)》面试题 04.05. 合法二叉搜索树

题目描述 实现一个函数&#xff0c;检查一棵二叉树是否为二叉搜索树。 示例 1: 输入: 2/ \1 3输出: true 示例 2: 输入: 5/ \1 4/ \3 6输出: false 解释: 输入为: [5,1,4,null,null,3,6]。 根节点的值为 5 &#xff0c;但是其右子节点值为 4 。 解题思路与代码 使用…...

Nginx 反向代理技术梳理

Nginx 反向代理技术梳理 使用反向代理脑图 域名 A 可以解析找到 CDN 缓存 用户点击 APP 即通过 URL 发送 HTTPS 请求域名会进入阿里云的 DNS 服务器&#xff0c;解析域名会做第一级负载均衡通过 CDN 解析出域名&#xff0c;通过阿里云配置转发到 CDN 缓存服务器 CDN 有数据则直…...

华为OD机试 - 整数编码(Java) | 机试题+算法思路+考点+代码解析 【2023】

整数编码 题目 实现一种整数编码方法,使得待编码的数字越小,编码后所占用的字节数越小。 编码规则如下: 1、编码时7位一组,每个字节的低7位用于存储待编码数字的补码。 2、字节的最高位表示后续是否还有字节,置1表示后面还有更多的字节,置0表示当前字节为最后一个字…...

蓝桥杯冲击01 - 质数篇

目录 前言 一、质数是什么 二、易错点 三、试除法判断是否为质数 四、质数常考三大模型 五、真题练手 前言 距离蓝桥杯还有一个月&#xff0c;高效复习蓝桥杯知识&#xff0c; 质数相关的题目在蓝桥杯中经常出现。例如&#xff0c;2016年蓝桥杯省赛初赛第四题就是要求判…...

【WEB前端进阶之路】 HTML 全路线学习知识点梳理(下)

前言 本文是HTML零基础小白学习系列的第三篇文章&#xff0c;点此阅读 上一篇文章 文章目录前言十五.HTML布局1.使用div元素添加网页布局2.使用table元素添加网页布局十六.HTML表单和输入1.文本域2.密码字段3.单选按钮4.复选框5.提交按钮十七.HTML框架1.iframe语法2.iframe设置…...

MySQL索引分类

1 MySQL索引都有哪些分类按数据结构分类可分为&#xff1a;Btree索引、Hash索引、Full-text索引;按物理存储分类可分为&#xff1a;聚簇索引、二级索引&#xff08;辅助索引&#xff09;;按字段特性分类可分为&#xff1a;主键索引、普通索引、前缀索引;按字段个数分类可分为&a…...

会声会影2023最新版图文安装详细教程

会声会影2023操作简单&#xff0c;使用便捷&#xff0c;创意十足&#xff0c;新增的分屏功能&#xff0c;轨道透明度&#xff0c;镜头平移等功能&#xff0c;让用户的剪辑过程更加流畅&#xff0c;轻松就能制作出令人惊艳的视频作品。它不仅符合家庭或个人所需的影片剪辑功能&a…...

Java中的反射

类加载器&#xff08;1&#xff09;类的加载当我们的程序在运行后&#xff0c;第一次使用某个类的时候&#xff0c;会将此类的class文件读取到内存&#xff0c;并将此类的所有信息存储到一个Class对象中。说明&#xff1a;a.图中的Class对象是指&#xff1a;java.lang.Class类的…...

STM32入门笔记(03):STM32F103C8T6定时器的输入捕获模式和编码器模式(SPL库函数版)

目录1.定时器的输入捕获模式定时器输入捕获实验代码实现程序说明实现思路实现效果知识要点2.定时器的编码器模式定时器编码器实验代码实现实验思路知识要点参考资料先导知识 [1] STM32入门笔记(02)&#xff1a;定时器之定时器中断、输入捕获和PWM输出&#xff08;SPL库函数版)…...

《网络安全》零基础教程-适合小白科普

《网络安全》零基础教程 目录 目录 《网络安全》零基础教程 第1章 网络安全基础 什么是网络安全 常见的网络安全威胁 网络安全的三个基本要素 网络安全的保障措施 第2章 网络攻击类型 病毒、蠕虫、木马、后门 DoS、DDoS攻击 ​​​​​​​SQL注入、XSS攻击 ​​​…...

微信小程序语言与web开发语言的区别

WXML与HTML的区别def&#xff1a;WXML是小程序框架设计的一套标签语言&#xff0c;用来构建小程序页面的结构&#xff0c;作用类似于web开发中的HTML区别&#xff1a;标签名称的不同如HTML中的div&#xff0c;span&#xff0c;img&#xff0c;a分别对应wxml中的view&#xff0c…...

【2022-09-14】米哈游秋招笔试三道编程题

第一题&#xff1a;最短子串 题目描述 米小游拿到了一个字符串&#xff0c;她想截取一个连续子串&#xff0c;使得该子串中包含至少k个连续的“mihoyo”。 你可以帮米小游求出最短的子串长度&#xff0c;以及对应的子串位置吗&#xff1f; 输入描述 第一行输入两个正整数n…...

云监控能力介绍

传统监控介绍 监控系统必要性 监控系统的能力清单 市面上常见商业及开源监控工具集 传统监控体系的不足 云监控介绍 云监控&#xff08;CloudMonitor&#xff09;是一项针对云资源和互联网应用进行监控的服务。 云监控为云上用户提供开箱即用的企业级开放型一站式监控解决方…...

HTML 文档类型

<!DOCTYPE> 声明帮助浏览器正确地显示网页。 <!DOCTYPE> 声明 Web 世界中存在许多不同的文档。只有了解文档的类型&#xff0c;浏览器才能正确地显示文档。 HTML 也有多个不同的版本&#xff0c;只有完全明白页面中使用的确切 HTML 版本&#xff0c;浏览器才能完…...

【UML】软件设计说明书 (完结)

目录一. &#x1f981; 前言1.1 编写目的1.2 背景1.3 定义1.4 参考资料二. &#x1f981; 总体设计2.1需求规定2.1.1 系统描述2.1.2 系统用例图2.2 运行环境2.2.1 设备2.2.2 支持软件2.2.3 接口2.2.4 控制2.3 基本设计概念2.4 系统结构三. &#x1f981; 用例分析与设计3.1 用户…...

MATLAB——FFT(快速傅里叶变换)

基础知识 FFT即快速傅里叶变换&#xff0c;利用周期性和可约性&#xff0c;减少了DFT的运算量。常见的有按时间抽取的基2算法&#xff08;DIT-FFT&#xff09;按频率抽取的基2算法&#xff08;DIF-FFT&#xff09;。 1.利用自带函数fft进行快速傅里叶变换 若已知序列x[4,3,2,6…...

力扣-进店却未进行过交易的顾客

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;1581. 进店却未进行过交易的顾客二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行…...

一文解决vscode中借助CMake配置使用Opencv过程中的所有问题

vscode中借助CMake配置使用opencv过程中的问题 vscode编译工程的完整过程 编写好CMakeLists.txtvscode中 ctrlshiftp 选择cmake configurevscode中 ctrlshiftp 选择cmake build CMake问题 1. set OpenCV_FOUND to FALSE so package “OpenCV” is considered to be NOT FOU…...

Golang每日一练(leetDay0004)

10. 正则表达式匹配 Regular Expression Matching 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s的&#xff0c;而不是部分…...

手机忘记密码解锁的 6 大软件方法

您可能想要解锁手机的原因有很多。也许您正在海外旅行并想使用当地的 SIM 卡&#xff0c;或者您可能刚买了一部二手手机并且需要删除之前所有者的个人数据。您可能想知道如何获得可以免费解锁任何手机的软件。Android 用户可以使用他们的指纹、面部识别或 PIN。您也可以通过快速…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...