返回

将有序数组转换为二叉搜索树:LeetCode 108 题剖析与解题思路

闲谈

导语
LeetCode 108 题「将有序数组转换为二叉搜索树」是针对二叉搜索树和数据结构的经典面试题。本篇文章将深入剖析这道题,提供两种不同的解法,并从时间和空间复杂度上进行比较。无论你是初学者还是进阶学习者,都可以在本文中找到有用的信息。

背景知识
首先,我们需要回顾一下什么是二叉搜索树。二叉搜索树是一种特殊的二叉树,它满足以下性质:

  • 每个节点的值都大于其左子树的所有节点的值。
  • 每个节点的值都小于其右子树的所有节点的值。
  • 左右子树也都是二叉搜索树。

解法一:递归法

def sortedArrayToBST(nums):
    if not nums:
        return None
    mid = len(nums) // 2
    root = TreeNode(nums[mid])
    root.left = sortedArrayToBST(nums[:mid])
    root.right = sortedArrayToBST(nums[mid+1:])
    return root

递归解法是将有序数组分成两部分,左半部分作为左子树,右半部分作为右子树,然后递归地将左右子树转换为二叉搜索树。这种解法的时间复杂度为 O(n log n),空间复杂度为 O(log n)。

解法二:迭代法

def sortedArrayToBST(nums):
    if not nums:
        return None
    stack = []
    root = TreeNode(nums[len(nums) // 2])
    stack.append(root)
    i = 0
    while stack:
        node = stack.pop()
        if i > 0:
            node.left = TreeNode(nums[i - 1])
            stack.append(node.left)
        if i + 1 < len(nums):
            node.right = TreeNode(nums[i + 1])
            stack.append(node.right)
        i += 2
    return root

迭代解法是使用一个栈来辅助构建二叉搜索树。首先将根节点压入栈中,然后循环弹出栈顶节点,将其作为当前节点。如果当前节点有左子树,则将左子树压入栈中;如果当前节点有右子树,则将右子树压入栈中。重复此过程,直到栈为空。这种解法的时间复杂度为 O(n),空间复杂度为 O(n)。

时间和空间复杂度比较

解法 时间复杂度 空间复杂度
递归法 O(n log n) O(log n)
迭代法 O(n) O(n)

总结
两种解法各有优劣。递归解法的时间复杂度较低,但空间复杂度较高;迭代解法的时间复杂度较高,但空间复杂度较低。在实际应用中,可以根据具体情况选择合适的解法。

拓展阅读