本文已参与「新人创作礼」活动,一起开启掘金创作之路。
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/va…
二叉搜索树有一个很优秀的特性,就是它在中序遍历时节点值应该是递增的。所以思路很显然了,用递归中序遍历一棵树,每一个搜索到的节点都应该比前一个搜索到的节点大。
树节点定义如下:
/**
- Definition for a binary tree node.
- public class TreeNode {
-
int val; -
TreeNode left; -
TreeNode right; -
TreeNode() {} -
TreeNode(int val) { this.val = val; } -
TreeNode(int val, TreeNode left, TreeNode right) { -
this.val = val; -
this.left = left; -
this.right = right; -
} - } */
题解如下:
class Solution {
TreeNode preNode=null;
//用于标记前一个节点
//也可以标记前一个节点的值,用Long.MIN_VALUE初始化。
public boolean isValidBST(TreeNode root) {
//特殊条件判断
if(root==null) return true;
//左子树必须满足二叉搜索树
if(!isValidBST(root.left)) return false;
//我们希望的是preNode.val<root.val,但是中序遍历的第一个节点显然没有preNode。
//所以这里加一个条件判断
if(preNode==null){
preNode=root;
}else if(preNode.val>=root.val){
return false;
}
//更新preNode为当前访问的节点
preNode=root;
//递归验证右子树
return isValidBST(root.right);
}
}