• Leetcode刷题98. 验证二叉搜索树


    给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树

    有效 二叉搜索树定义如下:

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

    示例 1:


    输入:root = [2,1,3]
    输出:true


    示例 2:


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

     

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/validate-binary-search-tree
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    1. class Solution {
    2. TreeNode pre = null;
    3. public boolean isValidBST(TreeNode root) {
    4. // return isValidBSTI(root);
    5. // return isValidBSTII(root);
    6. return isValidBSTIII(root);
    7. }
    8. //方法三:与方法二类似,不过这里使用栈实现中序遍历
    9. //时间和空间复杂度O(N)
    10. private boolean isValidBSTIII(TreeNode root) {
    11. if (root == null) {
    12. return true;
    13. }
    14. Stack stack = new Stack<>();
    15. while (!stack.isEmpty() || root != null) {
    16. while (root != null) {
    17. stack.push(root);
    18. root = root.left;
    19. }
    20. root = stack.pop();
    21. if (pre != null && root.val <= pre.val) {
    22. return false;
    23. }
    24. pre = root;
    25. root = root.right;
    26. }
    27. return true;
    28. }
    29. //方法二:利用中序遍历升序特点,时间和空间复杂度O(N)
    30. private boolean isValidBSTII(TreeNode root) {
    31. if (root == null) {
    32. return true;
    33. }
    34. if (!isValidBST(root.left)) {
    35. return false;
    36. }
    37. if (pre != null && root.val <= pre.val) {
    38. return false;
    39. }
    40. pre = root;
    41. return isValidBST(root.right);
    42. }
    43. //方法一:利用最大值和最小值,时间和空间复杂度O(N)
    44. //思考单独某一节点需要做什么?
    45. //判断当前节点的左孩子值是否小于当前节点值 和 右孩子值是否大于当前节点值
    46. //同时需要整个左子树都要满足小于当前节点值,整个右子树都要满足大于当前节点值
    47. private boolean isValidBSTI(TreeNode root) {
    48. if (root == null) {
    49. return true;
    50. }
    51. return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
    52. }
    53. private boolean isValidBST(TreeNode root, long min, long max) {
    54. if (root == null) {
    55. return true;
    56. }
    57. if (root.val <= min || root.val >= max) {
    58. return false;
    59. }
    60. //左子树最大值是root.val,右子树最小值是root.val
    61. return isValidBST(root.left, min, root.val) && isValidBST(root.right, root.val, max);
    62. }
    63. }

  • 相关阅读:
    Go 常量为什么只支持基本数据类型?
    【C++】基础入门(一):域、命名空间、C++输入&输出
    第三章-完善MBR
    前后端交互常见的几种数据传输格式 form表单+get请求 form表单+post请求 json键值对格式
    用户故事地图怎么用?实践才能出真知
    C语言学习之路(基础篇)—— 数据类型 02
    3、Android 活动Activity(2)(显式Intent和隐式Intent)
    市场逆风中,海尔智家如何续写增长故事
    2022.6.28 Linux——线程安全
    数据结构第三部分——树和二叉树(C语言版)
  • 原文地址:https://blog.csdn.net/Bonbon_wen/article/details/127418707