• 验证二叉查找树 · Validate Binary Search Tree


    [抄题]:

    [思维问题]:

    不知道要定义resultType, 其实用仔细分析判断条件就行了:是否是bst+最大最小值

    类似于平衡二叉树:是否平衡+左右的高度差

    [一句话思路]:

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    1-1也不是。所以left.max >= root.val也不行

    [画图]:

    [一刷]:

    1. 空节点可以认为是平衡二叉树
    2. 只有在root.left非空,并且直接拿left.max比root的取val大时,才能否定
    3. 最后可以直接返回left.min, right.max

    [二刷]:

    [三刷]:

    [四刷]:

    [五刷]:

    [总结]:

    定义结构-helper方法-(边界条件-不符合的情况-符合的情况)-调用helper方法

    [复杂度]:Time complexity: O(n) Space complexity: O(n)

    [英文数据结构,为什么不用别的数据结构]:

    [其他解法]:

    [Follow Up]:

    [LC给出的题目变变变]:

    BST中出现最多的元素:中序遍历,然后计数统计

    public class Solution {
        /**
         * @param root: The root of binary tree.
         * @return: True if the binary tree is BST, or false
         */
        public boolean isValidBST(TreeNode root) {
            ResultType r = validateHelper(root);
            return r.is_bst;
        }
        
        private ResultType validateHelper(TreeNode root) {
            if (root == null) {
                return new ResultType(true, Integer.MIN_VALUE, Integer.MAX_VALUE);
            }
            
            ResultType left = validateHelper(root.left);
            ResultType right = validateHelper(root.right);
            
            if (!left.is_bst || !right.is_bst) {
                // if is_bst is false then minValue and maxValue are useless
                return new ResultType(false, 0, 0);
            }
            
            if (root.left != null && left.maxValue >= root.val || 
                  root.right != null && right.minValue <= root.val) {
                return new ResultType(false, 0, 0);
            }
            
            return new ResultType(true,
                                  Math.max(root.val, right.maxValue),
                                  Math.min(root.val, left.minValue));
        }
    }
    View Code

     也可以不定义resulttype 不用这种奇葩思路。直接在isvalidate函数中定义节点为空或者大小不对就行了

  • 相关阅读:
    分析问题的方法
    听听冯洛伊曼的概念机器的齿轮声
    Nginx支持WebSocket配置
    原型模式
    redis日志位置
    修改centos7远程端口和nginx安全设置
    Java输出小端二进制文件
    centos7安装Java8
    Nginx教程
    centos7.6安装postgresql10
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8378410.html
Copyright © 2020-2023  润新知