携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情
刷题的日常-2022年8月18日
一天一题,保持脑子清爽
验证二叉搜索树
来自leetcode的 98 题,题意如下:
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例如下:
输入: root = [2,1,3]
输出: true
输入: root = [5,1,4,null,null,3,6]
输出: false
解释: 根节点的值是 5 ,但是右子节点的值是 4 。
理解题意
我们可以从题意中提取的条件如下:
- 题目给定一个二叉树
- 要求我们验证是否是二叉搜索树
- 返回验证结果
做题思路
二叉树我们知道是有左右两个子树,没有其它限制。而二叉搜索树同样有二叉树的性质,但是做了一些其它方面的限制,如,搜索树的左子树要小于当前节点,搜索树的右子树要大于当前节点,所以我们用前序遍历整棵树,其就是顺序的。
- 开辟一个栈用来保存中间结果
- 在遍历的过程中往栈中添加待遍历的数据
- 我们一开始要一直往左边走,保证第一次访问的是左子树
- 左子树访问之后,要把它的右子树一并放进栈中,这样就保证了我们是顺序遍历的
- 在遍历的过程中进行判断
- 如果当前访问的值小于之前被访问过的值,则不符合搜索树的限制,返回false
- 其它情况则可以继续遍历
- 没有遇到不满足条件的情况直接返回true
代码实现
代码实现如下:
class Solution {
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode curNode = root;
double minValue = -Double.MAX_VALUE;
while (curNode != null || stack.size() > 0) {
if (curNode != null) {
stack.push(curNode);
curNode = curNode.left;
continue;
}
TreeNode popNode = stack.pop();
if (popNode.val <= minValue) {
return false;
}
minValue = popNode.val;
curNode = popNode.right;
}
return true;
}
}