前言
本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
题目:验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
思路
如果每个树 从左结点-根节点-右节点 看必须满足
- 左节点<跟节点
- 跟节点<右节点 如果递归去遍历每棵树都满足此规律就整个树就是二叉搜索树,如果只要有一棵树不满足就退出,说明不是二叉搜索树,整个中序遍历完是升序
解题
先左节点-再跟节点-再右节点这是二叉树的中序遍历,先搞个中序遍历的模板套上,再往里面加条件。
List<Integer> res=new ArrayList<>();
public void helper(TreeNode root) {
if (root == null) {
return;
}
if (root.left != null) {
helper(root.left);
}
res.add(root.val);
if (root.right != null) {
helper(root.right);
}
}
然后修改函数的返回值肯定是boolean类型,我们这里需要逆向思维下,因为中序遍历完是个升序,那么我们再遍历过程中只需要判断当前节点如果小于或者等于前一个节点那么就不是升序就退出。代码如下:
class Solution {
TreeNode pre=null;
public boolean isValidBST(TreeNode root) {
//用于判断当前节点的左节点
if(root==null) return true;
if(!isValidBST(root.left)) return false;
//如果是null那么就是第一个节点,直接把root的值赋值给pre,因为前面没有节点了不用比较
if(pre==null) pre=root;
//如果不是就比较这个节点和前一个节点,如果小于等于中序遍历的前一个节点那么就不是升序就返回false
else if(root.val<=pre.val) return false;
//继续遍历把当前节点赋值给pre
pre=root;
//右节点
return isValidBST(root.right);
}
}
总结
此题就是考察二叉树的遍历,要熟悉前序,中序,后序遍历。知道中序遍历完二叉搜索树是升序的,然后再代码中去反向判断。好啦四月刷题打卡第一篇,好久没刷题了!有点生疏!看能坚持写几篇。主要是群里的那个Zoe同学天天催!!!而且的奖品有点诱人!能不能写到7篇能不能抽中还不一定呢!好啦滚去写代码过需求了。