108 - 将有序数组转换为二叉搜索树 - python

97 阅读2分钟

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树

一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

给定有序数组: [-10,-3,0,5,9],

一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:

      0
     / \
   -3   9
   /   /
 -10  5

二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树

由二叉搜索树的定义可知,根节点和它所对应的左右子树节点间存在一定的大小关系,而给定的是升序的有序数组,因此它正好和二叉搜索树相对应。有序数组的部分仍然是有序的,二叉搜索树的子树仍然满足二叉搜索树的性质,因此我们可以使用递归法逐步的构建二叉搜索树。

因为在递归构建二叉搜索树的过程中我们总是构建完根节点后再构建相应的左右子树,因此左右两个子树的高度差的绝对值绝不会超过1,满足题目对于高度平衡二叉搜索树的要求。

AC code

class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
        if nums == []: return None

        # 根节点
        mid = (0 + len(nums)) // 2
        root = TreeNode(nums[mid])
        root.left = self.sortedArrayToBST(nums[:mid])
        root.right = self.sortedArrayToBST(nums[mid + 1:])

        return root

至于给定一个有序数组为什么不能得到唯一的一棵二叉搜索树可参阅官方解答,或者自己手动画一些简单的例子直观感受。