版权声明:本文为博主原创文章,未经博主允许不得转载。有事联系:[email protected] https://blog.csdn.net/qq_17550379/article/details/82414300
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
解题思路
我们回到这样的一种性质:对于一个二叉搜索树来说,它的中序遍历是一个有序数组。所以,这个问题的另一种表述就是:通过一颗二叉搜索树的中序遍历,推导出这颗二叉搜索树的形状。但是这样推导出来的二叉搜索树形状有很多,所以题目又限定了这样的条件高度平衡二叉搜索树,但是依旧会出现很多答案,但是没关系,我们只要有一种解就可以啦。例如,有序数组[-10, -3, -1, -0, 9]
,我们有如下几种情况
-1 0
/ \ / \
-10 0 and -3 9
\ \ / \
-3 9 -10 -1
平衡二分搜索树有这样的性质:左子树的值小于右子树的值。所以,我们可以每次去数组的中间值,作为二分搜索树的中间节点,依次递归下去即可。
class Solution:
def _sortedArrayToBST(self, nums, start, end):
if start > end:
return None
mid = (end - start)//2 + start
midNode = TreeNode(nums[mid])
midNode.left = self._sortedArrayToBST(nums, start, mid - 1)
midNode.right = self._sortedArrayToBST(nums, mid + 1, end)
return midNode
def sortedArrayToBST(self, nums):
"""
:type nums: List[int]
:rtype: TreeNode
"""
return self._sortedArrayToBST(nums, 0, len(nums) - 1)
我们同样希望可以通过迭代来解决这个问题。
class Solution:
def sortedArrayToBST(self, nums):
"""
:type nums: List[int]
:rtype: TreeNode
"""
root, stack = None, [(0, len(nums)-1, None, None)]
while stack:
start, end, l_parent, r_parent = stack.pop()
if start > end:
continue
mid = start + (end - start)//2
node = TreeNode(nums[mid])
root = root or node
if l_parent:
l_parent.right = node
if r_parent:
r_parent.left = node
stack.append((start, mid-1, None, node))
stack.append((mid+1, end, node, None))
return root
我将该问题的其他语言版本添加到了我的GitHub Leetcode
如有问题,希望大家指出!!!