• 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. }

  • 相关阅读:
    gazebo中给机器人添加16线激光雷达跑LIO-SAM
    PyTorch实战:卷积神经网络详解+Python实现卷积神经网络Cifar10彩色图片分类
    vue项目推荐组件/工具库清单
    《系统架构设计师教程(第2版)》第5章-软件工程基础知识-05-净室软件工程(CSE)
    用R语言praise包写赞美之词
    【牛客-剑指offer-数据结构篇】JZ52 两个链表的第一个公共节点 两种思路 Java实现
    小波变换技术在图像压缩和重建中的应用研究-含Matlab代码
    python的PIL库
    python实现ssl通信
    C++基础知识
  • 原文地址:https://blog.csdn.net/Bonbon_wen/article/details/127418707