LeetCode 98 — 验证二叉搜索树

题目描述

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

节点的左子树只包含 严格小于 当前节点的数。
节点的右子树只包含 严格大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。

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

题目分析

递归

对于二叉搜索树 t 来说:
– 左子树是二叉搜索树,且所有结点值小于 t
– 右子树是二叉搜索树,且所有结点值大于 t

因此可以递归判断,核心是每次都把最大值和最小值的限制传递下去

中序遍历

使用中序遍历,把二叉树转成数组,再判断数组是否有序即可

Java

public boolean isValidBST(TreeNode root) {
    return isValidBST(root, null, null);
}

public boolean isValidBST(TreeNode root, Integer minValue, Integer maxValue) {
    if (root == null) {
        return true;
    }
    int value = root.val;
    if ((minValue != null && value <= minValue) || (maxValue != null && value >= maxValue)) {
        return false;
    }

    return isValidBST(root.left, minValue, value) && isValidBST(root.right, value, maxValue);
}

public boolean isValidBST2(TreeNode root) {
    List<Integer> list = dfs(root);
    for (int i = 0; i < list.size(); i++) {
        if (i >= 1 && list.get(i) <= list.get(i - 1)) {
            return false;
        }
    }
    return true;
}

private List<Integer> dfs(TreeNode root) {
    List<Integer> list = new ArrayList<>();
    if (root == null) {
        return list;
    }
    list.addAll(dfs(root.left));
    list.add(root.val);
    list.addAll(dfs(root.right));
    return list;
}

Kotlin

fun isValidBST(root: TreeNode?, minValue: Int? = null, maxValue: Int? = null): Boolean {
    if (root == null) {
        return true
    }
    val value = root.`val`
    if ((minValue != null && value <= minValue) || (maxValue != null && value >= maxValue)) {
        return false
    }

    return isValidBST(root.left, minValue, value) && isValidBST(root.right, value, maxValue)
}


fun isValidBST(root: TreeNode?): Boolean {
    val list = dfs(root)
    for (i in list.indices) {
        if (i >= 1 && list[i] <= list[i - 1]) {
            return false
        }
    }
    return true
}

private fun dfs(root: TreeNode?): List<Int> {
    val ans = ArrayList<Int>()
    if (root == null) {
        return ans
    }
    ans.addAll(dfs(root.left))
    ans.add(root.`val`)
    ans.addAll(dfs(root.right))
    return ans
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部