「题目路径」
题目描述
实现一个函数,检查一棵二叉树是否为二叉搜索树。 示例 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)
}