leetcode刷题笔记,将连续数组转换为平衡二叉树

在这里插入图片描述在这里插入图片描述该代码转自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有关的。

这是分治法的一种应用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值