【Lintcode】95. Validate Binary Search Tree

题目地址:

https://www.lintcode.com/problem/validate-binary-search-tree/description

判断一棵二叉树是否是BST。

可以用DFS。每访问一个节点的时候,只需注意到其值的范围可以被其父亲节点的值的范围完全确定,所以我们只需将值的范围作为参数在DFS的时候一层一层向下传递即可。代码如下:

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) {
        // write your code here
        if (root == null) {
            return true;
        }
        // 为避免树中有Integer.MIN_VALUE和Integer.MAX_VALUE这样的值,
        // 这里用Long的最大和最小做参数
        return dfs(root, Long.MIN_VALUE, Long.MAX_VALUE);
    }
    
    // 边DFS边判断root的范围是否在(lower, upper)之间
    private boolean dfs(TreeNode root, long lower, long upper) {
        if (root == null) {
            return true;
        }
        if (root.val <= lower || root.val >= upper) {
            return false;
        }
        
        return dfs(root.left, lower, root.val) && dfs(root.right, root.val, upper);
    }
}

class TreeNode {
    int val;
    TreeNode left, right;
    TreeNode(int x) {
        val = x;
    }
}

时间复杂度 O ( n ) O(n) ,空间 O ( h ) O(h)

算法正确性证明:
按节点的深度做数学归纳法。对深度为 0 0 的节点也就是树根,显然root的值可以任意取,这样判断的检验结果是正确的。假设对深度为 k k 的节点的检验都是对的,当DFS到深度为 k + 1 k+1 的节点时,如果这个节点 x x 是其父亲的左孩子,那么 x x 的上界显然是其父亲的值,而对于下界,其下界应该与其父亲相同,如果其父亲的下界是无穷小,那么显然正确;否则的话,对于其下界 y y ,从 x x 向上追溯,一定能追溯到将 y y 作为其右子树的下界传递下来的那个节点,也就是说 x x 是这个节点的右子树的一个节点,那么其下界当然就是 y y ,结论也对。对于别的情况也可以类似证明。由数学归纳法,对每层节点的检验方法都是对的。证明完毕。

发布了354 篇原创文章 · 获赞 0 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_46105170/article/details/105040436
今日推荐