1. 题目

2. 解答

2.1. 方法一

我们初始化根节点的范围为长整形数据的最小最大值 \([LONG\_MIN,LONG\_MAX]\),则其左子节点的取值范围为 \([LONG\_MIN,根节点值]\),右子节点的取值范围为 \([根节点值,LONG\_MAX]\)。

以此类推,可以得到,如果父节点的取值范围为 \([min, max]\),则其左子节点的取值范围为 \([min,父节点值]\),右子节点的取值范围为 \([父节点值,max]\)。

如果节点值在上述的范围内,则为二叉搜索树,反之则不是。

  1. class Solution {
  2. public:
  3. bool isValidBST(TreeNode* root, long min_value=LONG_MIN, long max_value=LONG_MAX) {
  4. if (root == NULL) return true;
  5. if (root->val <= min_value || root->val >= max_value) return false;
  6. else return(isValidBST(root->left, min_value, root->val) && isValidBST(root->right, root->val, max_value));
  7. }
  8. };
2.2. 方法二

二叉搜索树中序遍历输出的是一个升序序列,我们可以在遍历的时候判断是否升序即可。

  1. class Solution {
  2. public:
  3. bool isValidBST(TreeNode* root) {
  4. if (root == NULL) return true;
  5. stack<TreeNode *> s;
  6. TreeNode *prev = NULL;
  7. while (root || !s.empty())
  8. {
  9. while (root)
  10. {
  11. s.push(root);
  12. root = root->left;
  13. }
  14. root = s.top();
  15. // 判断当前节点值是否比上一个节点值大
  16. if (prev && prev->val >= root->val) return false;
  17. prev = root;
  18. s.pop();
  19. root = root->right;
  20. }
  21. return true;
  22. }
  23. };
2.3. 方法三

针对一个节点,有下列四种情况:

  • 节点为空或者节点的左右节点都为空;
  • 只有右结点为空;
  • 只有左结点为空;
  • 左右结点都不为空;

如果当前节点的左右子节点值满足二叉搜索树的条件,我们可以递归判断左右子树是否为二叉搜索树。如果左右子树也满足二叉搜索树条件,同时左子树最大节点(也即前驱结点)值小于当前节点值,右子树最小节点(也即后继结点)值大于当前节点值,那么整棵树即为二叉搜索树。

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10. class Solution {
  11. public:
  12. bool isValidBST(TreeNode* root) {
  13. if (root == NULL || (root->left == NULL && root->right == NULL)) return true;
  14. else if (root->left != NULL && root->right == NULL)
  15. {
  16. if (root->left->val >= root->val) return false;
  17. else return isValidBST(root->left) && isValidprev_node(root->left, root->val);
  18. }
  19. else if (root->left == NULL && root->right != NULL)
  20. {
  21. if (root->right->val <= root->val) return false;
  22. else return isValidBST(root->right) && isValidnext_node(root->right, root->val);
  23. }
  24. else
  25. {
  26. if (root->right->val <= root->val || root->left->val >= root->val) return false;
  27. else return isValidBST(root->left) && isValidprev_node(root->left, root->val)
  28. && isValidBST(root->right) && isValidnext_node(root->right, root->val);
  29. }
  30. }
  31. // 前驱节点是否有效
  32. bool isValidprev_node(TreeNode* root, int data)
  33. {
  34. while (root->right != NULL)
  35. {
  36. root = root->right;
  37. }
  38. if (root->val < data) return true;
  39. else return false;
  40. }
  41. // 后继节点是否有效
  42. bool isValidnext_node(TreeNode* root, int data)
  43. {
  44. while (root->left != NULL)
  45. {
  46. root = root->left;
  47. }
  48. if (root->val > data) return true;
  49. else return false;
  50. }
  51. };

获取更多精彩,请关注「seniusen」!

LeetCode 98——验证二叉搜索树的更多相关文章

  1. LeetCode 98. 验证二叉搜索树 | Python

    98. 验证二叉搜索树 题目来源:https://leetcode-cn.com/problems/validate-binary-search-tree 题目 给定一个二叉树,判断其是否是一个有效的 ...

  2. Java实现 LeetCode 98 验证二叉搜索树

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

  3. 力扣Leetcode 98. 验证二叉搜索树

    验证二叉搜索树 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身 ...

  4. LeetCode 98 验证二叉搜索树

    题目: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是 ...

  5. Leetcode 98 验证二叉搜索树 Python实现

    给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二叉搜索 ...

  6. LeetCode 98. 验证二叉搜索树(Validate Binary Search Tree)

    题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也 ...

  7. LeetCode:验证二叉搜索树【98】

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

  8. 【LeetCode】98. 验证二叉搜索树

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

  9. 98. 验证二叉搜索树 前序遍历解法以及后续遍历解法(go语言)

    leetcode题目 98. 验证二叉搜索树 前序遍历 最简洁的答案版本,由于先判断的是根节点,所以直接判断当前root的值v,是否满足大于左子树最大,小于右子树最小,然后再遍历左子树,右子树是否是这 ...

随机推荐

  1. 小程序内嵌H5——判断小程序环境的坑

    现在各种小程序风靡,这边H5的需求还没有搞定,产品又要求做小程序版本,做可以,关键是618前上线,我-- whatever,618要做推广,日期订了,剩下的就只能是排期,定方案,尽可能完成. 最后和产 ...

  2. Jquery实现简单图片轮播

    html代码: <div class="show"> <div class="left"> <div class="sh ...

  3. tomcat启动startup.bat一闪而过【亲测有效】

    遇到很多次运行startup.bat后,一个窗口一闪而过的问题,但是从来没去纠正怎样修改配置才是正确的,现在从网上查阅的资料整理如下:tomcat在启动时,会读取环境变量的信息,需要一个CATALIN ...

  4. CentOS 6.8安装Ceph

    机器规划 IP 主机名 角色 10.101.0.1 ceph01 mon admin mds 10.101.0.2 ceph02 ods 10.101.0.3 ceph03 ods 10.101.0. ...

  5. IIS网站的应用程序与虚拟目录的区别及应用

    IIS网站 一个网站可以新建无数个应用程序和目录 应用程序 同一域名下程序的独立开发,独立部署的最佳应用策略. 应用程序的应用场景: 1. 域名的分布 比如:www.baidu.com,对于后台,我们 ...

  6. Ubuntu18.04安装完应该做的一些事 显卡驱动安装和cuda8.0

    博主装Ubuntu18.04主要是为了用于跑深度学习,所以我们先来搞搞gcc环境 第一步:安装多版本gcc.g++可切换 sudo apt-get install gcc-4.8 gcc-4.8-mu ...

  7. 纯JS实现轮播图特效——详解

    <div id="slider"> <div id="sliderImgs"> <img src="img/mi04.j ...

  8. Angular.js进阶

    1.常用指令 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UT ...

  9. QQ空间运营 怎么做一个QQ人气号?

    QQ空间,用户太年轻,他们渐渐长大. 空间,用户消费水准偏低,貌似很难开发,除非玩灰链,否则同等人气,和微信比起来,一个地下,一个天上. 然而,他们快要长大,即将成为消费主力军,难免会转移微信,但情怀 ...

  10. 详解 Python3 正则表达式(一)

    本文翻译自:https://docs.python.org/3.4/howto/regex.html 博主对此做了一些批注和修改 ^_^ 正则表达式介绍 正则表达式(Regular expressio ...