LeetCode|LeetCode 验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:输入:
2
/ \
13
输出: true
示例 2:输入:
5
/ \
14
/ \
36
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
解法一: 可以利用它本身的性质来做,即 左 < 根 < 右,初始化时带入系统最大值和最小值,在递归过程中换成它们自己的节点值,用 long 代替 int 就是为了包括 int 的边界条件。
public boolean isValidBST(TreeNode root) {
if (root == null) return true;
return valid(root, Long.MIN_VALUE, Long.MAX_VALUE);
}public boolean valid(TreeNode root, long low, long high) {
if (root == null) return true;
if (root.val <= low || root.val >= high) return false;
return valid(root.left, low, root.val) && valid(root.right, root.val, high);
}
解法二: 下面我们使用中序遍历来做,这种方法思路很直接,通过中序遍历将所有的节点值存到一个数组里,然后再来判断这个数组是不是有序的。
public boolean isValidBST(TreeNode root) {
List list = new ArrayList();
inOrder(root, list);
for (int i = 0;
i < list.size() - 1;
++i) {
if (list.get(i) >= list.get(i + 1)) return false;
}
return true;
}public void inOrder(TreeNode node, List list) {
if (node == null) return;
inOrder(node.left, list);
list.add(node.val);
inOrder(node.right, list);
}
解法三: 也可以用非递归来做,需要用到栈,因为中序遍历可以非递归来实现,所以只要在其上面的代码稍加改动就可以了。
public boolean isValidBST(TreeNode root) {
Stack s = new Stack();
TreeNode p = root, pre = null;
while (p != null || !s.empty()) {
while (p != null) {
s.push(p);
p = p.left;
}TreeNode t = s.pop();
if (pre != null && t.val <= pre.val) return false;
pre = t;
p = t.right;
}
return true;
}
【LeetCode|LeetCode 验证二叉搜索树】思路参考自 [LeetCode] Validate Binary Search Tree 验证二叉搜索树
推荐阅读
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- java中如何实现重建二叉树
- leetcode|leetcode 92. 反转链表 II
- 二叉树路径节点关键值和等于目标值(LeetCode--112&LeetCode--113)
- LeetCode算法题-11.|LeetCode算法题-11. 盛最多水的容器(Swift)
- LeetCode(03)Longest|LeetCode(03)Longest Substring Without Repeating Characters
- Leetcode|Leetcode No.198打家劫舍
- Pytorch学习|sklearn-SVM 模型保存、交叉验证与网格搜索
- [leetcode数组系列]1两数之和
- 笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历