返回
将有序数组转换为二叉搜索树:LeetCode 108 题剖析与解题思路
闲谈
2023-12-22 23:00:59
导语
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) |
总结
两种解法各有优劣。递归解法的时间复杂度较低,但空间复杂度较高;迭代解法的时间复杂度较高,但空间复杂度较低。在实际应用中,可以根据具体情况选择合适的解法。
拓展阅读