问题描述:
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.
Example 1:
2 / \ 1 3
Binary tree [2,1,3]
, return true.
Example 2:
1 / \ 2 3
Binary tree [1,2,3]
, return false.
原问题链接:https://leetcode.com/problems/validate-binary-search-tree/
问题分析
最初想法
这个问题粗看的时候很简单,我们有一种递归的思路。就是对于里面每个节点,判断它如果有左右子节点的话,它的当前节点应该大于它的左子节点的值,如果有右子节点的话,应该小于它的右子节点的值。于是得到如下的实现代码:
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public boolean isValidBST(TreeNode root) { if(root == null || (root.left == null && root.right == 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); } }
可是在实际执行的过程中却报错了,对于如下的输入来说:
[10,5,15,null,null,6,20]
它相当于是一棵如下的树:
在上图,我们虽然每个点都满足了它的左子节点比当前节点小,右子节点值比当前节点大,但是出现了一个节点15的左子节点小于根节点15的情况。这和前面二叉搜索树的定义有冲突。这是因为我们前面忽略了一个问题,在二叉搜索树里,一个节点比它的左子树的所有元素要大,比它右子树的所有元素要小。而这里仅仅根据一个节点和它的左右子节点的比较关系是不够的。
修改
于是,我们需要根据前面的情况进行修改。 在任何一个节点,我们需要定义这个节点所在的范围。因此需要引入两个变量,min, max。分别表示它所在的最大值和最小值。这样,对于任何一个节点来说,它的左子节点对应的值的范围是[min, node.val],就是从min到当前节点的值。而右子节点值对应的范围则是[node.val, max]。
于是我们就得到如下的代码:
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public boolean isValidBST(TreeNode root) { return isValidBST(root, Integer.MIN_VALUE, Integer.MAX_VALUE); } private boolean isValidBST(TreeNode node, int min, int max) { if(node == null) return true; return node.val > min && node.val < max && isValidBST(node.left, min, node.val) && isValidBST(node.right, node.val, max); } }
可是我们运行的时候会发现居然出错了,导致错误结果的是如下的一组输入:
[2147483647]
这里的问题就在于,我们当前在递归里设定的初始值为Integer.MAX_VALUE, Integer.MIN_VALUE。它们相当于是两个边界值,而在问题里要求是一个节点的值和它的左右子节点不能是相等的关系。所以会出现还差一点的情况。
这里的问题就是在于我们初始设定了这么两个极端的值,但是如果正好某个节点的值就是这两个值的话,我们程序就会出问题。所以在代码里就不应该设定初始的最大和最小值。而且从最初的代码调用里,第一个检查的元素就是根节点,它取任意值都是合理的。所以我们只需要设定在后面的递归里逐步将当前的值作为最大或者最小值传递到后面的调用中来判断就好了。
详细的代码实现如下:
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public boolean isValidBST(TreeNode root) { return isValidBST(root,null,null); } private boolean isValidBST(TreeNode root, Integer max, Integer min){ if(root==null) return true; if(max !=null && root.val >= max) return false; if(min != null && root.val <= min) return false; return isValidBST(root.left, root.val, min) && isValidBST(root.right, max, root.val); } }
上面代码里不是利用原生的int类型,而是改为使用Integer类型的参数。这样在最开始的情况下,将最大值和最小值都设置为null,可以规避硬设定一个初始值的问题。
相关推荐
python python_leetcode题解之098_Validate_Binary_Search_Tree
leetcode ...Validate Binary Search Tree - 二分查找 二分查找 + 数据缓存:1095. Find in Mountain Array 链表 有序链表合并:21. Merge Two Sorted Lists 回文 双指针判断回文:680. 验证回文字符串 Ⅱ
c语言基础 c语言_leetcode题解之0098_validate_binary_search_tree.zip
js js_leetcode题解之98-validate-binary-search-tree.js
5. **二叉树**:二叉树问题包括遍历、查找、平衡调整等,如"二叉树的最大路径和"(Maximum Path Sum)、"验证二叉搜索树"(Validate Binary Search Tree)。 6. **回溯**:回溯是一种尝试所有可能解的算法策略,...
- **Validate Binary Search Tree**:验证一个二叉树是否为二叉搜索树。 - **Recover Binary Search Tree**:恢复二叉搜索树中的两个错误节点。 - **Binary Tree Path**:找到二叉树中和为目标值的路径。 - **...
25. Validate Binary Search Tree:验证二叉搜索树。 26. Maximum Depth of Binary Tree:计算二叉树的最大深度。 27. Minimum Depth of Binary Tree:计算二叉树的最小深度。 28. Balanced Binary Tree:判断一个...
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 ...
* [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]...
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...
- Validate Binary Search Tree:验证给定的二叉树是否为有效的二叉搜索树(BST),这需要对二叉树的遍历和树节点值的区间限制有清晰的理解。 - Valid Parentheses:这是一个用来检测字符串中括号是否有效匹配的问题...
6. BinaryTree(二叉树): 二叉树是每个节点最多有两个子节点的树数据结构,常用于组织数据,以便进行快速查找、插入和删除。文件中提到的二叉树相关题目包括: - Validate Binary Search Tree(验证二叉搜索树) ...
Validate Binary Search Tree)和判断对称二叉树(101. Symmetric Tree)。这两个问题都涉及到对二叉树结构的深入理解和遍历策略。 首先,我们来看验证二叉搜索树。二叉搜索树(Binary Search Tree, BST)是一种...
本压缩包文件“python-leetcode面试题解之第98题验证二叉搜索树-题解.zip”专注于解决LeetCode的第98题,即“验证二叉搜索树”(Validate Binary Search Tree)。下面我们将深入探讨这个话题,了解如何使用Python来...
25. Validate Binary Search Tree:验证二叉搜索树的合法性。 26. Maximum Depth of Binary Tree:二叉树的最大深度。 27. Minimum Depth of Binary Tree:二叉树的最小深度。 28. Balanced Binary Tree:判断二叉树...
- 例如,验证二叉搜索树(Validate Binary Search Tree)需要判断给定的二叉树是否符合二叉搜索树的定义。 - 计算二叉树的最大深度(Maximum Depth of Binary Tree)考察递归的使用。 - 平衡二叉树(Balanced Binary...
在本压缩包“php-leetcode题解之验证二叉搜索树.zip”中,主要包含的是使用PHP语言解决LeetCode上的一道题目——验证二叉搜索树(Validate Binary Search Tree)。LeetCode是一个流行的在线编程挑战平台,它提供了...
5. **验证二叉搜索树的有效性** (Validate Binary Search Tree) - 验证一个二叉树是否是二叉搜索树,可以通过中序遍历后检查序列是否严格升序来实现。 - 示例代码中,使用迭代中序遍历,在遍历过程中维护一个栈,...