Convert Sorted Array to Binary Search Tree

Given an array where elements are sorted in ascending order, convert it to a height balanced BST.

先复习下什么是二叉搜索树(引自Wikipedia):

二叉查找树Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树

  1. 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

  2. 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

  3. 任意节点的左、右子树也分别为二叉查找树。

再复习下什么是平衡二叉树(引自GeekforGeek): An empty tree is height-balanced. A non-empty binary tree T is balanced if: 1) Left subtree of T is balanced 2) Right subtree of T is balanced 3) The difference between heights of left subtree and right subtree is not more than 1.

将二叉搜索树按中序遍历即可得升序 key 这个容易实现,但反过来由升序 key 逆推生成二叉搜索树呢?按照二叉搜索树的定义我们可以将较大的 key 链接到前一个树的最右侧节点,这种方法实现极其简单,但是无法达到本题「树高平衡- 左右子树的高度差绝对值不超过1」的要求,因此只能另辟蹊径以达到「平衡二叉搜索树」的要求。binary search tree满足左<根<右的特性,根节点应该是有序数组的中间点,从中间点分开为左右两个有序数组,在分别找出其中间点作为原中间点的左右两个子节点,这不就是是二分查找法的核心思想么

复杂度分析

递归调用middleNode方法时每个key被访问一次,故时间复杂度可近似认为是 O(n).

切记本题中根据所给升序序列建立平衡二叉搜索树的过程中需要做到不重不漏,故不能再套用start =mid,end =mid的模板了

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def sortedArrayToBST(self, nums):
        """
        :type nums: List[int]
        :rtype: TreeNode
        """
        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

Last updated

Was this helpful?