算法笔记_面试题_5.验证二叉搜索树
题目
98. 验证二叉搜索树
难度:中等
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:2/ \1 3
输出: true
示例 2:
输入:5/ \1 4/ \3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5 ,但是其右子节点值为 4 。
解法
中序遍历的方法:
vector<int> result;
bool isValidBST(TreeNode* root) {inorderTraversal(root);if (result.size()<=1) return true;for(int i=0; i<result.size()-1; i++){if(result[i]>=result[i+1]) return false;}return true;
}vector<int> inorderTraversal(TreeNode* root){if(root != NULL){inorderTraversal(root->left);result.push_back(root->val);inorderTraversal(root->right);}return result;
}
时间复杂度较高O(2n), 空间复杂度O(n)
递归写法
思想:
- 先设定两个哨兵(最大值、最小值);
- 定义好递归退出条件(root为空时为true退出,root值大于最大或者root值小于最下时为false退出);
- 当树为一个合格的二叉搜索树时,总是 左子数值 < 当前根节点 < 右子树值;
- 此时若将左节点作为根节点、LONG_MIN最为最小值、当前根的值为最大值进行判断;
- 此时若将右节点作为根节点、当前根的值为最小值、LONG_MAX最最大值进行判断。
bool isValidBST(TreeNode* root) {//最开始使用两个极值最为上下阶return recurse(root, LONG_MIN, LONG_MAX);
}bool recurse(TreeNode* root, long long min, long long max){if (!root) return true; //验证到最后,根节点为空时,就可以返回true了else if(root->val >= max || root->val <= min) // 注意等于号别少return false;//作为左子节点,根节点当成上限,作为右子节点时,根节点作为下限else return recurse(root->left, min, root->val) && recurse(root->right, root->val, max);
}
复杂度分析
时间复杂度 : O(n),其中 nn 为二叉树的节点个数。在递归调用的时候二叉树的每个节点最多被访问一次,因此时间复杂度为 O(n)。
空间复杂度 : O(n),其中 nn 为二叉树的节点个数。递归函数在递归过程中需要为每一层递归函数分配栈空间,所以这里需要额外的空间且该空间取决于递归的深度,即二叉树的高度。最坏情况下二叉树为一条链,树的高度为 n ,递归最深达到 n 层,故最坏情况下空间复杂度为 O(n)。
算法笔记_面试题_5.验证二叉搜索树相关推荐
- LeetCode 之 JavaScript 解答第98题 —— 验证二叉搜索树(Validate Binary Search Tree)
Time:2019/4/24 Title: Vaildata Binary Search Tree Difficulty: Medium Author: 小鹿 题目:Vaildata Binary S ...
- [CareerCup] 4.5 Validate Binary Search Tree 验证二叉搜索树
4.5 Implement a function to check if a binary tree is a binary search tree. LeetCode上的原题,请参见我之前的博客Va ...
- [Leedcode][JAVA][第98题][验证二叉搜索树]
[问题描述][第98题][验证二叉搜索树][中等] 给定一个二叉树,判断其是否是一个有效的二叉搜索树.假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节 ...
- 【LeetCode】【HOT】98. 验证二叉搜索树(递归)
[LeetCode][HOT]98. 验证二叉搜索树 文章目录 [LeetCode][HOT]98. 验证二叉搜索树 package hot;class TreeNode{int val;TreeNo ...
- 力扣 验证二叉搜索树
力扣 验证二叉搜索树 题目描述 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树. 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数. 节点的右子树只包含 大于 ...
- 20190914:(leetcode习题)验证二叉搜索树
验证二叉搜索树 题目 大致思路 代码实现 题目 大致思路 直接利用中序遍历的代码进行修改,将中序遍历按顺序存放入数组,按照中序的特点和二叉搜索树的特点,得到的数组应该是有序的,并且是升序的.最后进行判 ...
- 剑指offer——面试题63:二叉搜索树的第k个结点
剑指offer--面试题63:二叉搜索树的第k个结点 Solution1: 20180916重做 /* struct TreeNode {int val;struct TreeNode *left;s ...
- 【重点】剑指offer——面试题27:二叉搜索树与双向链表
剑指offer--面试题27:二叉搜索树与双向链表 Solution1: 这是书上的代码,要理解好最近几道题,对指针的操作比较多... class Solution { public:TreeNode ...
- 剑指offer——面试题24:二叉搜索树的后序遍历序列
剑指offer--面试题24:二叉搜索树的后序遍历序列 Solution1: 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二 ...
- 020.验证二叉搜索树
题目链接: 98. 验证二叉搜索树 大概思路: 题目要求: 判断给的二叉树是不是二叉搜索树. 二叉搜索树的特征: 节点的左子树所有节点的值均小于该节点的值,右节点反之,同时对搜索树的每一个节点都适用此 ...
最新文章
- LPMS_IMU在TX2上使用
- 再议《反驳 吕震宇的“小议数据库主键选取策略(原创)” 》
- Strut2的属性驱动,模型驱动的理解
- height百分比失效
- .Net开发人员应该下载的十种必备工具(一)
- C/C++程序从源代码到可执行程序的流程
- java 当前时间格式_java 处理时间的各种方式——获取时间——时间格式化
- Hibernate与MyBatis区别
- ios 给网页传值_iOS学习——页面的传值方式
- 并发容器(J.U.C)中的队列类
- android studio继承关系,Android Studio中查看类的继承关系
- 7923 consoleconsumer 怎么关闭_英雄联盟手游怎么设置最好 LOL手游最佳设置攻略_英雄联盟手游...
- SiO2 介孔二氧化硅纳米颗粒的明胶包裹/二氧化硅杂化凝胶固定化醇脱氢酶/白蛋白和壳聚糖包裹的二氧化硅微球/二氧化硅包覆的量子点荧光编码微球
- 新书推荐——Linux系统管理与服务器配置
- excel跨多个表格求和_收藏学习!一个Excel函数搞定进销存报表,你还在花钱买软件?...
- 牛年第一瓜!阿里女员工被初中文化男子骗走500多万!开豪车连骗12名女性,被判无期!...
- Objective-C知识点总结
- 手机通讯录被删除后怎么恢复
- Linux系统安装IonCube的方法详解教程
- 硬件程序员和软件开发程序员相比,哪一个就业发展前景比较好呢?