这是面试题中比较基础的,但是又对于数据结构有帮助的题。
分析:构建二叉树,那么第一个应该想到的是,根节点就是数组中间的节点,根节点的左孩子是mid-1,右孩子是mid+1
那么如何对应到整个数组上呢,第二个想到,应该用递归,递归是比较符合树的逻辑的。
那么一种思路是: 根的左节点把左半部分 [0,mid-1] ,调用自己,递归下去
右边是[mid+1,end] ,
这样左边一层一层的就到了底,然后构造好了,再一层一层传回来,最后传到了最初的根节点。
这时候再递归右半部分,同理。 递归完成的时候,树就构建好了。
但是有个问题就是,如果我们只用原函数,每一次都得把数组复制一遍,这样的消耗是O(nlogn), 显然我们可以做的更好。
下边代码应该是最简洁清晰的。再构建一个函数,加入start和end,利用start和end传递index值
public TreeNode sortedArrayToBST(int[] num) {
return sortedTBSThelper(num, 0, num.length-1);
}
public TreeNode sortedTBSThelper(int[] num, int start, int end){
if(start>end) return null;
int mid=(start+end)/2;
TreeNode left=sortedTBSThelper(num, start,mid-1 );
TreeNode root=new TreeNode(num[mid]);
root.left=left;
root.right=sortedTBSThelper(num,mid+1,end);
return root;
}