程序员面试金典-面试题 04.05. 合法二叉搜索树

Posted silentteller

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序员面试金典-面试题 04.05. 合法二叉搜索树相关的知识,希望对你有一定的参考价值。

题目:

https://leetcode-cn.com/problems/legal-binary-search-tree-lcci/

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

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

分析:

两种做法,利用二分搜索树中序遍历的性质,节点val值的顺序应该是严格递增的。可以每遍历到一个节点就和上一个节点比较,如果符合条件就继续。

第二种由于二分搜索树的性质其根节点右子树的所有节点值都应该大于根节点,左子树的节点值应该小于根节点,基于这个条件我们可以维护一个最大值最小值区间,去递归判断每一个节点是否符合要求。

判断左子树时就将区间最小值改为当前结点的值,判断右子树时就将区间最大值修改为当前结点的值即可。

程序:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isValidBST(TreeNode root) {
        isValid(root);
        return res;
    }
    private void isValid(TreeNode node){
        if(node == null)
            return;
        isValid(node.left);
        if(v == null)
            v = node.val;
        else if(v >= node.val){
            res = false;
            return;
        }else{
            v = node.val;
        }
        isValid(node.right);
    }
    private Integer v;
    private boolean res = true;
}
class Solution {
    public boolean isValidBST(TreeNode root) {
        return isValid(root, Long.MIN_VALUE, Long.MAX_VALUE);
    }
    private boolean isValid(TreeNode node, long min, long max){
        if(node == null)
            return true;
        if(node.val > min && node.val < max)
            return isValid(node.left, min, node.val) && isValid(node.right, node.val, max);
        return false;
    }
}

 

以上是关于程序员面试金典-面试题 04.05. 合法二叉搜索树的主要内容,如果未能解决你的问题,请参考以下文章

程序员面试金典-面试题 04.02. 最小高度树

#yyds干货盘点# LeetCode程序员面试金典:二叉搜索树序列

#yyds干货盘点# LeetCode程序员面试金典:最小高度树

#yyds干货盘点# LeetCode程序员面试金典:检查子树

二叉树-二叉搜索树(中序)

LeetCode题解分类汇总(包括剑指Offer和程序员面试金典,持续更新)