【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
        // 为避免树中有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(n),空间 O ( h ) O(h) O(h)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值