返回

将有序数组转化为二叉搜索树:算法精解

Android

将有序数组转化为二叉搜索树是一道经典算法题,它考验算法工程师对二叉树和数组操作的基本理解。本文将通过深入剖析一道 LeetCode 每日一题,带领读者逐步掌握这道题目的解题思路和技巧。

算法步骤

将有序数组转化为二叉搜索树的基本步骤如下:

  1. 确定中间元素: 将数组中索引位于中间位置的元素作为二叉搜索树的根节点。
  2. 递归构造左子树: 对数组中左半部分执行步骤 1,将中间元素作为左子树的根节点。
  3. 递归构造右子树: 对数组中右半部分执行步骤 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 每日一题,本文详细介绍了递归和非递归两种解法,并提供了示例代码和详细的说明。掌握这道题目的解题思路和技巧,对于算法工程师提高算法能力大有裨益。