题目

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.验证二叉搜索树相关推荐

  1. LeetCode 之 JavaScript 解答第98题 —— 验证二叉搜索树(Validate Binary Search Tree)

    Time:2019/4/24 Title: Vaildata Binary Search Tree Difficulty: Medium Author: 小鹿 题目:Vaildata Binary S ...

  2. [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 ...

  3. [Leedcode][JAVA][第98题][验证二叉搜索树]

    [问题描述][第98题][验证二叉搜索树][中等] 给定一个二叉树,判断其是否是一个有效的二叉搜索树.假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节 ...

  4. 【LeetCode】【HOT】98. 验证二叉搜索树(递归)

    [LeetCode][HOT]98. 验证二叉搜索树 文章目录 [LeetCode][HOT]98. 验证二叉搜索树 package hot;class TreeNode{int val;TreeNo ...

  5. 力扣 验证二叉搜索树

    力扣 验证二叉搜索树 题目描述 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树. 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数. 节点的右子树只包含 大于 ...

  6. 20190914:(leetcode习题)验证二叉搜索树

    验证二叉搜索树 题目 大致思路 代码实现 题目 大致思路 直接利用中序遍历的代码进行修改,将中序遍历按顺序存放入数组,按照中序的特点和二叉搜索树的特点,得到的数组应该是有序的,并且是升序的.最后进行判 ...

  7. 剑指offer——面试题63:二叉搜索树的第k个结点

    剑指offer--面试题63:二叉搜索树的第k个结点 Solution1: 20180916重做 /* struct TreeNode {int val;struct TreeNode *left;s ...

  8. 【重点】剑指offer——面试题27:二叉搜索树与双向链表

    剑指offer--面试题27:二叉搜索树与双向链表 Solution1: 这是书上的代码,要理解好最近几道题,对指针的操作比较多... class Solution { public:TreeNode ...

  9. 剑指offer——面试题24:二叉搜索树的后序遍历序列

    剑指offer--面试题24:二叉搜索树的后序遍历序列 Solution1: 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二 ...

  10. 020.验证二叉搜索树

    题目链接: 98. 验证二叉搜索树 大概思路: 题目要求: 判断给的二叉树是不是二叉搜索树. 二叉搜索树的特征: 节点的左子树所有节点的值均小于该节点的值,右节点反之,同时对搜索树的每一个节点都适用此 ...

最新文章

  1. LPMS_IMU在TX2上使用
  2. 再议《反驳 吕震宇的“小议数据库主键选取策略(原创)” 》
  3. Strut2的属性驱动,模型驱动的理解
  4. height百分比失效
  5. .Net开发人员应该下载的十种必备工具(一)
  6. C/C++程序从源代码到可执行程序的流程
  7. java 当前时间格式_java 处理时间的各种方式——获取时间——时间格式化
  8. Hibernate与MyBatis区别
  9. ios 给网页传值_iOS学习——页面的传值方式
  10. 并发容器(J.U.C)中的队列类
  11. android studio继承关系,Android Studio中查看类的继承关系
  12. 7923 consoleconsumer 怎么关闭_英雄联盟手游怎么设置最好 LOL手游最佳设置攻略_英雄联盟手游...
  13. SiO2 介孔二氧化硅纳米颗粒的明胶包裹/二氧化硅杂化凝胶固定化醇脱氢酶/白蛋白和壳聚糖包裹的二氧化硅微球/二氧化硅包覆的量子点荧光编码微球
  14. 新书推荐——Linux系统管理与服务器配置
  15. excel跨多个表格求和_收藏学习!一个Excel函数搞定进销存报表,你还在花钱买软件?...
  16. 牛年第一瓜!阿里女员工被初中文化男子骗走500多万!开豪车连骗12名女性,被判无期!...
  17. Objective-C知识点总结
  18. 手机通讯录被删除后怎么恢复
  19. Linux系统安装IonCube的方法详解教程
  20. 硬件程序员和软件开发程序员相比,哪一个就业发展前景比较好呢?

热门文章

  1. 【转】浅谈命令查询职责分离(CQRS)模式
  2. MongoDB find方法
  3. js动态计算移动端rem
  4. AppBuilder(二)UseStageMarker
  5. linux 修改ip地址 和关闭防火墙设置
  6. HttpClient 学习整理【转】
  7. 序列化和反序列化(八)——Externalizable接口
  8. 39. Use private inheritance judiciously
  9. 32. 如果确实需要删除元素,则需要在remove这一类算法之后调用erase
  10. CSS的一些常用知识点