携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情
这是我出差的第一题,也是卡住不太会的一题
验证二叉搜索树
该题出自力扣的98题—— 验证二叉搜索树【中等题】,二叉树的递归理念,一直都没有十分牢固
审题
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
- 题意并不困难,就是会比较繁琐,因为需要知道搜索二叉树的含义
- 所谓搜索二叉树 —— 左节点比根节点小,右节点比根节点大
- 那么显而易见的就可以萌生出一种解决方案:利用递归的方式实现
- 这个方法有一个细节需要注意:不只是比当前子树的根节点比较,还需要与父级甚至最顶层的根节点比较
- 因此,需要衍生出一个方法去调用:
- 左节点的最小值是最小值,最大值就是根节点
- 右节点的最小值就是根节点,最大值就是最大值
- 除却这种方式,还有一种方式就是 利用中序遍历 —— 那就直接就是升序的;中序遍历时,判断当前节点是否大于中序遍历的前一个节点,如果大于,说明满足 BST,继续遍历;否则直接返回 false。
- 第一眼的想法也是中序遍历。二叉搜索树中序遍历得到升序,对给定的二叉树中序遍历,结果记录于res之中,检验res是否为严格的升序,若是则为true,反之false。不过没想到竟然还能这么简洁
编码
class Solution {
public boolean isValidBST(TreeNode root) {
return validate(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
public boolean validate(TreeNode node, long min, long max) {
if (node == null) {
return true;
}
if (node.val <= min || node.val >= max) {
return false;
}
return validate(node.left, min, node.val) && validate(node.right, node.val, max);
}
}
复制代码
class Solution {
double last = -Double.MAX_VALUE;
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
if (isValidBST(root.left)) {
if (last < root.val) {
last = root.val;
return isValidBST(root.right);
}
}
return false;
}
}
复制代码