一、题目描述
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
二、解题思路
根据二叉搜索树的特征,我们可以知道二叉搜索的树的中序遍历是一个升序排列的,依照这个想法,本题转换了:验证给定二叉树的中序遍历结果是否递增。
为了解决这个问题,通过检验当前节点是否大于其前趋节点即可。
所以我们使用一个全局变量pre来记录遍历过程中当前节点的上一个节点。若当前访问节点小于其前驱节点,则说明此树不是二叉搜索树。
注意问题:不能直接判断:(根节点值>左子节点的值)&&(根节点值<右子节点的值),也就是说根节点的值要比其左子树的中的最大值还要大,而左子树中的最大值是左子树的最右节点,而恰好此最大值节点就是当前根节点的中序遍历前驱。根节点的值不能仅小于其右子节点的值的情况同理。
二、代码演示
class Solution {
TreeNode pre = null; // 记录前一个节点,用于检查是否递增遍历
public boolean isValidBST(TreeNode root) {
//二叉搜索树可以为空
if(root==null){
return true;
}
//递归传递左子节点
if(!isValidBST(root.left)){
return false;
}
//如果当前节点小于等于中序遍历的前一个节点直接返回false。
if(pre != null && pre.val >= root.val){
return false;
}
//更新前驱节点
pre = root;
//递归访问右子树
if(!isValidBST(root.right)){
return false;
}
return true;
}
}