《leetcode108. 将有序数组转换为二叉搜索树》

260 阅读2分钟

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

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

示例:

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

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

      0
     / \
   -3   9
   /   /
 -10  5

二叉搜索树:任意一个根节点的值,都大于它的左子树里的所有节点的值,小于它的右子树里的所有节点的值。

对于一个二叉搜索树,中序遍历它(左,根,右),那遍历出来的放进一个数组里,这个数组自然就是升序的。所以题中的升序数组就是一颗二叉搜索树的中序遍历的结果。

那给一个升序数组,可能形成的BFT是唯一的吗?答案是不唯一,每一个数组项都可以作为根节点,都能形成BFT。

加了一个高度平衡的限制,一个升序数组能形成唯一的BFT吗?答案也是不唯一的。因为高度平衡,所以根节点就必须是数组中间的那个值,或者如果是偶数个,中间索引的前一项。这样才能满足根节点的左右子树的数量相同,或差一个。

确定了初始根节点后(0),数组里这个项的左边的所有项,就自然都是根节点的左子树里的。那再继续确定根节点的左子树时,范围就缩小到了一半,只在左边搜索就可以(-10,-3)。

这就是一个递归的过程。不断从一个数组里找到中间值,当作根节点,再递归确定它的左右子树。

var sortedArrayToBST = function(nums) {
    function helper(left,right){
        if(left>right){
            return null
        }
        let mid=parseInt((left+right)/2)
        let root=new TreeNode(nums[mid])
        root.left=helper(left,mid-1)
        root.right=helper(mid+1,right)
        return root
    }
    return helper(0,nums.length-1)
};

定义一个函数,接受左右两个指针,当左指针大于右指针,就意味着没有可找的值了,就返回空。这也是递归的终止条件。