二叉树中的深搜之验证二叉搜索树

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

二叉搜索树,有一个典型的特征:中序遍历是有序的,所以可以从这个角度出发解决问题;

寻找子问题:给一个头节点,判断该头节点的树是否是一个二叉搜索树,返回 boolean;

分析子问题:可以让左子树进行判断,是否是一个 二叉搜索树,然后判断当前的 root 节点是否符合二叉搜索树的定义,最后判断右子树;

引入全局变量 prev,用来存当前中序遍历的前置值,这样就可以让前置值与 root 节点的值进行比较,从而判断当前的 root 节点是否符合二叉搜索树的定义;(因为二叉搜索树中序遍历是有序的)

最后要综合判断左子树,当前节点,右子树是不是都符合二叉搜索树的定义;

递归出口:当节点 root 为 null 的时候,直接返回 true;

这道题引入剪枝的概念:也就是当某个方向的结果已经不满足的条件了,就直接返回,不再进行后续的操作,这样有利于提高效率; 

二叉树中的深搜之验证二叉搜索树_第1张图片

代码实现

class Solution {
    long prev = Long.MIN_VALUE;     // 定义一个最小值,作为前置值
    public boolean isValidBST(TreeNode root) {
        if(root == null) return true;   // 递归出口
        
        boolean left = isValidBST(root.left);   // 看左子树
        // 剪支
        if(left == false) return false;

        boolean cur = false;        // 判断当前节点
        if(root.val > prev){        
            cur = true;
        }    
        prev = root.val;            // 更新 前置值
        // 剪支
        if(cur == false) return false;

        boolean right = isValidBST(root.right);     // 看右子树

        return left && right && cur;
    }
}

你可能感兴趣的:(二叉树深搜,数据结构,递归)