验证二叉搜索树

Posted by zhouqian on Tuesday, August 9, 2022

力扣 98. 验证二叉搜索树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。


方案一:递归,遍历每一种可能。

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isValidBST(root *TreeNode) bool {
    // 开始递归,因为题目范围为 MinInt32~ MaxInt32,故而边界在 MinInt32 - 1, MaxInt32 + 1
    return recur(root, math.MinInt32 - 1, math.MaxInt32 + 1)
}

// recur 递归函数,leftRange, rightRange 表示左右边界(非包含关系)
func recur(root *TreeNode, leftRange, rightRange int) bool {
    if root == nil {
        return true
    }

    if root.Val <= leftRange || root.Val >= rightRange {
        return false
    }
    // 因为左子树只包含小于当前节点的数,右子树只包含大于当前节点的数
    // 所以对左右子树的递归边界为当前节点的值
    return recur(root.Left, leftRange, root.Val) && 
        recur(root.Right, root.Val, rightRange)
}
  • 时间复杂度:O(n),n 为树中节点个数,因为需要遍历树中每个节点,所以时间复杂度为 O(n)。
  • 空间复杂度:O(n),n 为树中节点个数,树在最好情况下深度为 logn,最差情况下为 n,所以空间复杂度为 O(n)。