该代码转自leetcode官方;
首先,TreeNode结构为:
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
看了半天,终于把它看懂了,首先生成的结果
这是这个算法的答案。根据答案构建二叉树:
由答案给出的顺序根据算法可以得出,递归更深层次的含义:
1.首先第一个结果为0,毫无疑问,由下面的代码得出:
int p= (left+right)/2
TreeNode root = TreeNode(nums[p]);
这里的p由初始输入left=0和right=nums.length-1.该数组长度为5.
算出来p为2.
2.第二和第三个结果为-10和5可以确定的一点就是,递归执行在该代码完成以后,也就是说:
先执行:
root.left =helper(left,p-1);
root.right =helper(p+1,right);
return root;
每一个p对应这个代码段是线性执行的,root.left,root.right 求值,用的都是同一个p。而不是先把root.left执行,随后进入root.left里面的递归,直到root.left都求出来了,再执行后面的root.right.这样会引起root.right中p的混乱。因为前一个递归,p变了很多次。所以一个p算出来,root.left和root.right都要同时执行。
正确的理解方式是:root.left执行完了,他要接着调用自己进行递归,但是这个调用一定是发生在下一段代码root.right执行完成一次以后。然后继续
每一次更新 p的值。
同时,每一次p的变动,都会使函数的输入参数left和right发生变化。把一个数组拆分成更小的数组。数组变小了,理所应当子递归中的 left和right也会相应的变化。
3.这是p的变化图:
p在数组下标为2时被拆分为两个小的数组。左边小数组的的长度范围为0到(2-1)右边的小数组长度范围为(2+1)到4.在作为参数传给递归函数。
继续通过递归拆分,而拆分的数组范围是和算出来的p有关的。
这是分治法的一种应用。