给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树。
示例:
给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5
思路:给定一个数组,让我们构造二叉搜索树,首先构造的这棵树你得满足二叉搜索树的特性,也就是中序遍历有序,左<中<右。同时还要求高度最小,也就是尽量让一层上有更多的结点,若没这个限制,我们完全可以构造出一棵高度很大的树,根节点是9,它的左子树是5,5的左子树是0,……就这种左单边树,但高度太大了。
因此我们在决定根节点的时候,每次都取中间值,这样左右两边的数字数量要么相等要么相差一个,能达到平衡二叉树的效果,这样得到的树既满足二叉搜索树的特性,又保证了高度最小。
代码(Python):
class Solution(object):
def sortedArrayToBST(self, nums):
left = 0
right = len(nums) - 1
if left > right:
return
mid = (left + right) / 2 #每次都取中间值作为根节点
root = TreeNode(nums[mid])
index = nums.index(root.val) #找到根节点在数组中的下标
numsLeft = nums[:index] #分割数组左半边
numsRight = nums[index+1:] #分割数组右半边
root.left = self.sortedArrayToBST(numsLeft)
root.right = self.sortedArrayToBST(numsRight)
return root