[路飞]_算法_ 合法二叉搜索树——递归

64 阅读2分钟

题目描述

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

示例 1:

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

示例 2:

输入:
    5
   / \
  1   4
     / \
    3   6
输出: false

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

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/le… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

首先需要了解什么是二叉搜索树

二叉搜索树(BST),就是其根节点,左子树所有节点的值要小于根节点,右子树所有子节点的值要大于根节点。 并且所有子节点为根节点的树也满足

解题过程

新增一个函数,递归判断每个节点为根节点的树是否是BST,直到叶子节点 因为这里,只要有一个节点不满足,就不是BST

  • 递归时候我们需要传入,需要判断的节点,节点值不能超过的最小值,和最大值
  • 根节点的最小最大值为政府无穷大
  • 一个节点的值 root.val<=min||root.val>=max的话,则不是BST返回false
  • 否则就继续递归判断其左右子节点,其中左子节点一定比当前子节点小,所以重新定义下限,把自己的值作为下限传入,上限不变
  • 右子节点必须大于当前节点值,所以重新定义其上限为当前节点值,下限值不变
  • 直到判断到空节点 返回true

代码

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isValidBST = function(root,) {
    return childIsBst(root,-Infinity,Infinity)//根节点没有上下限,传入政府无穷大
};
/**判断一棵树是否是二叉搜索树
 */
var childIsBst=function(root,min,max){
    if(!root) return true;
    if(root.val<=min||root.val>=max){
        //节点值必须在区间内,否则就返回false
        return false;
    }
    //不是以上情况,就继续递归,
    return childIsBst(root.left,min,root.val)&&childIsBst(root.right,root.val,max)

}