关闭

Validate Binary Search Tree

标签: javaleetcodebinary search treestree
127人阅读 评论(0) 收藏 举报
分类:

题目描述:

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);
}


0
0
查看评论

Leetcode 98. Validate Binary Search Tree C++及javascript解答,不同语言不同玩法

题意:给定一棵二叉树,写程序判断这颗二叉树是否为合法的二分查找树(对于节点root,其所有左子树中节点都满足 node.val root.val) 转载请注明出处:http://blog.csdn.net/sunny606 C++: /** * Definition for a binar...
  • sunny606
  • sunny606
  • 2017-03-15 22:03
  • 217

【LeetCode】Validate Binary Search Tree 解题报告

今天CSDN博客发生异常,折腾了大半天终于发出了这篇博文。 【题目】 Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as follo...
  • ljiabin
  • ljiabin
  • 2014-12-03 16:58
  • 9414

leetcode 98 Validate Binary Search Tree (python)

python Validate Binary Search Tree
  • sxingming
  • sxingming
  • 2016-07-27 08:36
  • 697

LeetCode 98 — Validate Binary Search Tree(C++ Java Python)

题目:http://oj.leetcode.com/problems/validate-binary-search-tree/ Given a binary tree, determine if it is a valid binary search tree (BST). Assume a ...
  • dragon_dream
  • dragon_dream
  • 2014-04-02 09:51
  • 2231

[C++]LeetCode: 122 Validate Binary Search Tree (是否是合法BST树)

题目: 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 nod...
  • cinderella_niu
  • cinderella_niu
  • 2015-01-25 17:01
  • 819

LeetCode98—Validate Binary Search Tree

LeetCode98—Validate Binary Search Tree判断是否是查找二叉树,三种方式。
  • zhangxiao93
  • zhangxiao93
  • 2016-03-11 21:30
  • 380

二叉搜索树(Binary Search Tree )的定义及分析

定义:     二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 每个结点都有一个作为搜索依据的关键码(key),所有结点的关键码互不相同。 左子树(如果非空)上所有结点的关键码都小于根结点的关键码。 右子树(如果非空)上所有...
  • jsh13417
  • jsh13417
  • 2013-01-22 21:59
  • 3437

数据结构-BST(Binary Search Tree)

/****************************************** 数据结构: BST(Binary Search Tree),二叉查找树; 性质: 若结点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若结点的右子树不空,则右子树上所有结点的值均大于它的根结点的值...
  • Jarily
  • Jarily
  • 2013-03-15 19:00
  • 7133

二叉搜索树(Binary Search Tree)的插入与删除

二叉搜索树的插入关键是要找到元素应该插入的位置,可以采用与Find类似的方法。 二叉搜索树的删除则要考虑三种情况:   1.要删除的是叶节点:直接删除,并再修改其父节点指针置为NULL   2.要删除的节点只有一个孩子的节点:将其父节点的指针指向要删除节点的孩子节点...
  • song_hui_xiang
  • song_hui_xiang
  • 2015-08-16 13:10
  • 1018

二叉搜索树的查询、插入与删除操作(Binary Search Tree, Search, Insert, Delete)(C++)

一、概念     设 x 是二叉搜索树中的一个结点。如果 y 是 x 左子树中的一个结点,那么 y.key ≦ x.key。如果 y 是 x 右子树中的一个结点,那么 y.key ≧ x.key。     为了便于描述,我们按如下方式定...
  • zhangpiu
  • zhangpiu
  • 2015-11-19 16:09
  • 1139
    个人资料
    • 访问:64089次
    • 积分:2776
    • 等级:
    • 排名:第15296名
    • 原创:215篇
    • 转载:37篇
    • 译文:0篇
    • 评论:6条
    最新评论