Validate Binary Search Tree

题目描述:

Given a binary tree, determine if it is a valid binary search tree (BST).

Assume a BST is defined as follows:

  • The left subtree of a node contains only nodes with keys less than the node's key.
  • The right subtree of a node contains only nodes with keys greater than the node's key.
  • Both the left and right subtrees must also be binary search trees.
一开始就想到了中序遍历,用94题的做法遍历,用时19ms

public List<Integer> inorderTraversal(TreeNode root) {
    Set<TreeNode> visited=new HashSet<TreeNode>();
    List<Integer> result=new ArrayList<Integer>();
    Stack<TreeNode> stack=new Stack<TreeNode>();
    stack.push(root);
    while(!stack.isEmpty()){
    	TreeNode p=stack.peek();
    	if(p.left!=null&&!visited.contains(p.left)){
    		stack.push(p.left);
    	}else{
    		p=stack.pop();
    		result.add(p.val);
    		visited.add(p);
    		if(p.right!=null){
    			stack.add(p.right);
    		}
    	}
    }
    return result;
}

public boolean isValidBST(TreeNode root) {
	List<Integer> list=inorderTraversal(root);
	for(int i=1;i<list.size();i++){
		if(list.get(i)<=list.get(i-1))
			return false;
	}
	return true;
}

然后用递归遍历,用时4ms,说明递归还是比迭代快一些啊

List<Integer> list = new ArrayList<Integer>();  

public boolean isValidBST(TreeNode root) {  
    if (root == null) return true;  
    if (root.left == null && root.right == null) return true;  
    inOrderTraversal(root);  
    for (int i = 1; i < list.size(); i++) {  
        if (list.get(i) <= list.get(i - 1)) return false;  
    }  
    return true;  
 }  
  
public void inOrderTraversal(TreeNode root) {  
    if (root == null) return;  
    inOrderTraversal(root.left);  
    list.add(root.val);  
    inOrderTraversal(root.right);  
} 

其实之前一直有一个错误的想法,就是只考虑了每个根节点比其左孩子大比其右孩子小。

如10 5 15 # # 6 20就是满足每一个节点都比左孩子大,比右孩子小。

错误代码:

public boolean isValidBST(TreeNode root) {
    if(root==null)
    	return true;
    if(root.left!=null&&root.left.val>=root.val)
    	return false;
    if(root.right!=null&&root.right.val<=root.val)
    	return false;
    return isValidBST(root.left)&&isValidBST(root.right);
}

还有一种根据二叉搜索树的定义来写的算法,但是这个算法当取到Integer.MAX_VALUE的时候就会出现BUG。

public boolean isValidBST(TreeNode root) {
    return check(root, Integer.MIN_VALUE, Integer.MAX_VALUE);
}

public boolean check(TreeNode root,int min,int max){
	if(root==null)
		return true;
	if(root.val>=max||root.val<=min)
		return false;
	return check(root.left, min, root.val)&&check(root.right, root.val, max);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值