[路飞]_面试题 04.05. 合法二叉搜索树

71 阅读1分钟

题目路径

题目描述

实现一个函数,检查一棵二叉树是否为二叉搜索树。 示例 1:

输入: 
    2
   / \
  1   3
输出: true

示例 2:

    5
   / \
  1   4
     / \
    3   6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
     根节点的值为 5 ,但是其右子节点值为 4 。

解题思路

二叉搜索数(BST)是二叉树的一种,但是只允许你在左侧节点存储(比父节点小的值),在右侧节点存储(比父节点大的值)。
因此,对于

输入: 
     a
   /  \
  b    c
 / \  / \
d   ef  g
输出: true

的d,e,f,g要有, d<b<a, b<e<a, a<f<c, a<c<g, 对于当前节点p都要在一个区间之内,假设这个区间为[lower,upper],

根据对二叉搜索树的观察(下面的规律适合所有的二叉搜索树):

upper的值为p节点 从底向上 所在的子树整体 作为左子树时对应的根节点的值,如对于节点e的upper为a; lower的值为p节点 从底向上 所在的子树整体 作为右子树时对应的根节点的值,如对于节点f的lower为a。 因此,在递归判断树中每个节点是否满足二叉搜索树的规律时,对于在区间[lower,upper]内的当前节点p,当我们转而判断p的左子树时我们只需更新upper的值为p.val(即对于p.left,有[lower, p.val]),而当我们转而判断p的右子树时我们只需更新lower的值为p.val(即对于p.right,有[p.val, upper]),如下: 初始时,可以将lower设为无穷小,upper设为无穷大。

代码

var is = function(root){
    return pre(root, -Infinily, Infinily);
}

var pre = function(root, min, max){
    if(root == null) return true;
    if(root.val <= min || root.val >= max){
        return false;
    }
    return pre(root.left, min, root.val) && pre(root.right, root.val, max)
}