返回
将有序数组转化为二叉搜索树:算法精解
Android
2023-10-12 01:30:58
将有序数组转化为二叉搜索树是一道经典算法题,它考验算法工程师对二叉树和数组操作的基本理解。本文将通过深入剖析一道 LeetCode 每日一题,带领读者逐步掌握这道题目的解题思路和技巧。
算法步骤
将有序数组转化为二叉搜索树的基本步骤如下:
- 确定中间元素: 将数组中索引位于中间位置的元素作为二叉搜索树的根节点。
- 递归构造左子树: 对数组中左半部分执行步骤 1,将中间元素作为左子树的根节点。
- 递归构造右子树: 对数组中右半部分执行步骤 1,将中间元素作为右子树的根节点。
算法复杂度
- 时间复杂度:O(n),其中 n 为数组长度。
- 空间复杂度:O(n),对于递归实现,栈空间的大小取决于树的高度,而树的高度最坏情况下为 n。
递归解法
class Solution:
def sortedArrayToBST(self, nums):
if not nums:
return None
mid = len(nums) // 2
root = TreeNode(nums[mid])
root.left = self.sortedArrayToBST(nums[:mid])
root.right = self.sortedArrayToBST(nums[mid+1:])
return root
非递归解法
class Solution:
def sortedArrayToBST(self, nums):
if not nums:
return None
stack = []
root = None
for num in nums:
node = TreeNode(num)
if not stack:
root = node
else:
while stack and num < stack[-1].val:
stack.pop()
if not stack:
stack.append(node)
else:
stack[-1].right = node
stack.append(node)
return root
示例
nums = [-10,-3,0,5,9]
result = Solution().sortedArrayToBST(nums)
# 输出:二叉搜索树
总结
将有序数组转化为二叉搜索树是一道经典算法题,它考察算法工程师对二叉树和数组操作的基本理解。通过深入剖析 LeetCode 每日一题,本文详细介绍了递归和非递归两种解法,并提供了示例代码和详细的说明。掌握这道题目的解题思路和技巧,对于算法工程师提高算法能力大有裨益。