`
huntfor
  • 浏览: 201248 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[leetcode]Validate Binary Search Tree

 
阅读更多

新博文地址:[leetcode]Validate Binary Search Tree

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.

 判断二叉搜索,这道题有个坑,首先我们要理解清楚二叉搜索树的概念:

二叉搜索树(BST) 
二叉搜索树(也叫二叉排序树)或者是空树,或者满足一下三个条件:
1. 如果左子树不空,则左子树所有关键字都小于根关键字值
2. 如果右子树不空,则右子树所有关键字都大于根关键字值
3. 左右子树又各是一颗二叉搜索树

 下面来看这样的定义:

或者是空树,或者满足这样的条件:
1. 左子树值 < 根值
2. 右子树值 > 根植
3. 左右子树各是二叉排序树

 这样的定义对吗?跟上面的BST的定义有什么区别呢?

首先:答案是肯定有区别的,来看这样一棵树

     5
  /     \
4      10
      /      \
    3        11

 它肯定不是BST,但是满足下面的定义,因此,要注意在证明BST的时候,不应该只和父节点作比较

事实上,BST的中序遍历是一个递增数列,我们可以根据这一个特性来判断BST的合法性。

中序遍历是很容易的,判断一个list是否是递增也是很容易的。代码如下:

    	List<Integer> list = new ArrayList<Integer>();
	public boolean isValidBST(TreeNode root) {
		if (root == null || (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);
	}

 不过中序遍历判断法实用了O(n)的空间。

还可以直接实用递归来判断BST的合法性:

用到的技巧是:

1. 左子树具有和父节点一样的下限
2. 右子树具有和父节点一样的上限
3. 左(右)子树的上(下)限是父节点

 代码如下:

	public boolean isValidBST(TreeNode root) {
		if (root == null || (root.left == null && root.right == null)) {
			return true;
		}

		return isValid(root, Integer.MIN_VALUE, Integer.MAX_VALUE);
	}

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

 

分享到:
评论

相关推荐

    python-leetcode题解之098-Validate-Binary-Search-Tree

    python python_leetcode题解之098_Validate_Binary_Search_Tree

    c语言-leetcode题解之0098-validate-binary-search-tree.zip

    c语言基础 c语言_leetcode题解之0098_validate_binary_search_tree.zip

    js-leetcode题解之98-validate-binary-search-tree.js

    js js_leetcode题解之98-validate-binary-search-tree.js

    Leetcode的ac是什么意思-LeetCodeInJava:leetcode-java

    Leetcode的ac是什么意思 LeetCodeInJava List #98 Validate Binary Search Tree #100 Same Tree #104 Maximum Depth of Binary Tree #122 Best Time to Buy and Sell Stock II #136 Single Number #150 Evaluate ...

    javalruleetcode-what_the_dead_men_say:what_the_dead_men_say

    Validate Binary Search Tree - Java Recursive - Java Iterative - Java Inorder 0099 Recover Binary Search Tree - Java Recursive 0101 Symmetric tree - Java Recursive - Java Iterative - C Recursive...

    Leetcode book刷题必备

    25. Validate Binary Search Tree:验证二叉搜索树。 26. Maximum Depth of Binary Tree:计算二叉树的最大深度。 27. Minimum Depth of Binary Tree:计算二叉树的最小深度。 28. Balanced Binary Tree:判断一个...

    Leetcode题目+解析+思路+答案.pdf

    - **Validate Binary Search Tree**:验证一个二叉树是否为二叉搜索树。 - **Recover Binary Search Tree**:恢复二叉搜索树中的两个错误节点。 - **Binary Tree Path**:找到二叉树中和为目标值的路径。 - **...

    LeetCode最全代码

    * [Binary Search Tree](https://github.com/kamyu104/LeetCode#binary-search-tree) * [Breadth-First Search](https://github.com/kamyu104/LeetCode#breadth-first-search) * [Depth-First Search]...

    leetcode跳跃-leetcode:leetcode一天一次

    leetcode ...Validate Binary Search Tree - 二分查找 二分查找 + 数据缓存:1095. Find in Mountain Array 链表 有序链表合并:21. Merge Two Sorted Lists 回文 双指针判断回文:680. 验证回文字符串 Ⅱ

    LeetCode 精选 TOP 面试题(3)1

    Validate Binary Search Tree)和判断对称二叉树(101. Symmetric Tree)。这两个问题都涉及到对二叉树结构的深入理解和遍历策略。 首先,我们来看验证二叉搜索树。二叉搜索树(Binary Search Tree, BST)是一种...

    LeetCode各公司题目合集

    - Validate Binary Search Tree:验证给定的二叉树是否为有效的二叉搜索树(BST),这需要对二叉树的遍历和树节点值的区间限制有清晰的理解。 - Valid Parentheses:这是一个用来检测字符串中括号是否有效匹配的问题...

    python-leetcode面试题解之第98题验证二叉搜索树-题解.zip

    本压缩包文件“python-leetcode面试题解之第98题验证二叉搜索树-题解.zip”专注于解决LeetCode的第98题,即“验证二叉搜索树”(Validate Binary Search Tree)。下面我们将深入探讨这个话题,了解如何使用Python来...

    leetcode java

    - 例如,验证二叉搜索树(Validate Binary Search Tree)需要判断给定的二叉树是否符合二叉搜索树的定义。 - 计算二叉树的最大深度(Maximum Depth of Binary Tree)考察递归的使用。 - 平衡二叉树(Balanced Binary...

    php-leetcode题解之验证二叉搜索树.zip

    在本压缩包“php-leetcode题解之验证二叉搜索树.zip”中,主要包含的是使用PHP语言解决LeetCode上的一道题目——验证二叉搜索树(Validate Binary Search Tree)。LeetCode是一个流行的在线编程挑战平台,它提供了...

    常见算法题答案及解析

    25. Validate Binary Search Tree:验证二叉搜索树的合法性。 26. Maximum Depth of Binary Tree:二叉树的最大深度。 27. Minimum Depth of Binary Tree:二叉树的最小深度。 28. Balanced Binary Tree:判断二叉树...

    CleanCodeHandbook_v1.0.3

    6. BinaryTree(二叉树): 二叉树是每个节点最多有两个子节点的树数据结构,常用于组织数据,以便进行快速查找、插入和删除。文件中提到的二叉树相关题目包括: - Validate Binary Search Tree(验证二叉搜索树) ...

    手稿_V1.031

    5. **验证二叉搜索树的有效性** (Validate Binary Search Tree) - 验证一个二叉树是否是二叉搜索树,可以通过中序遍历后检查序列是否严格升序来实现。 - 示例代码中,使用迭代中序遍历,在遍历过程中维护一个栈,...

    LeetCode:LeetCode上一些算法的解答

    5. **二叉树**:二叉树问题包括遍历、查找、平衡调整等,如"二叉树的最大路径和"(Maximum Path Sum)、"验证二叉搜索树"(Validate Binary Search Tree)。 6. **回溯**:回溯是一种尝试所有可能解的算法策略,...

Global site tag (gtag.js) - Google Analytics