将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 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)
};
定义一个函数,接受左右两个指针,当左指针大于右指针,就意味着没有可找的值了,就返回空。这也是递归的终止条件。