二叉搜索树的有效性验证

331 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。
给你一个二叉树的根节点 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);
}

}

image.png