返回

探索 LeetCode 98:验证二叉搜索树的 Swift 解法

闲谈

理解二叉搜索树

二叉搜索树(Binary Search Tree)是一种特殊的二叉树,其具有以下性质:

  • 每个节点的值都大于其左子树中所有节点的值。
  • 每个节点的值都小于其右子树中所有节点的值。

二叉搜索树是一种非常重要的数据结构,广泛应用于各种领域,如查找、排序、插入和删除等操作。

顾毅的 Swift 解法

顾毅的 Swift 解法基于递归和中序遍历。首先,在 Swift Playground 中创建一个二叉树节点的结构体,并实现其比较函数。然后,使用递归的方式遍历二叉树,并检查每个节点的值是否满足二叉搜索树的性质。如果所有节点的值都满足性质,则返回 true,否则返回 false。

以下是顾毅的 Swift 解法的具体步骤:

  1. 定义二叉树节点的结构体:
public class TreeNode {
    public var val: Int
    public var left: TreeNode?
    public var right: TreeNode?
    public init(_ val: Int) {
        self.val = val
        self.left = nil
        self.right = nil
    }
}
  1. 实现二叉树节点的比较函数:
public func <(lhs: TreeNode, rhs: TreeNode) -> Bool {
    return lhs.val < rhs.val
}
  1. 使用递归的方式遍历二叉树,并检查每个节点的值是否满足二叉搜索树的性质:
public func isValidBST(_ root: TreeNode?) -> Bool {
    return helper(root, nil, nil)
}

private func helper(_ root: TreeNode?, _ min: TreeNode?, _ max: TreeNode?) -> Bool {
    if root == nil {
        return true
    }
    if min != nil && root!.val <= min!.val {
        return false
    }
    if max != nil && root!.val >= max!.val {
        return false
    }
    return helper(root!.left, min, root) && helper(root!.right, root, max)
}

算法分析

顾毅的 Swift 解法的时间复杂度为 O(n),其中 n 为二叉树的节点数。这是因为该解法需要遍历整个二叉树,并且在每个节点上进行常数时间的比较操作。空间复杂度为 O(h),其中 h 为二叉树的高度。这是因为该解法使用了递归,并且在每次递归调用时都需要存储当前节点的信息。

结语

LeetCode 98:验证二叉搜索树(Top 100)是一道经典算法题,考察了考生对二叉搜索树的理解和递归算法的掌握程度。顾毅的 Swift 解法基于递归和中序遍历,是一种简单易懂、高效实用的解法。希望本文对大家的学习有所帮助,也欢迎大家在评论区分享自己的解法和心得体会。