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