递归,通俗来讲,指的是函数自己调自己,必须要有中止条件;
套用模板:递归中止条件、处理当前层逻辑、下探到下一层;
- 避免人肉递归;
- 精简步骤,找到最小可重复子单元;
- 使用数学归纳法;
本质就是递归,找重复性,以及分解问题和最后组合每个子问题的结果
- 最近重复性-分治;
- 回溯最优重复性-动态规划;
这周的作业有点摸不着头脑
看了一遍题目内容之后,首先联想到了二叉树的定义,指的是树中节点的儿子个数不超过2个的有序树;然后列了下,超哥教给我们的递归模板:递归中止条件、处理当前层逻辑、调用下一层。
当时,我很疑惑,我要怎么找到这两个元素,并且再往上找,找到第一次,两个元素有交集的地方,说实话,我不知道怎么切入点在哪。
Krahets 在答案中提到,一共可以分成两种情况。
- 特殊情况:根节点为null或者待找的节点,本身就是root节点,返回root即可;
- 一般情况:待找的两个节点分布在root节点的两侧,从顶层开始递归调用
Q:为什么这里省去了一个步骤,就是递归调用钱,先处理本层;
回顾一下定义:前序遍历,根左右;中序遍历,左根右。
Q:为什么递归中止条件是这样的:
//1. 首先考虑递归中止条件
if(preorder.length ==0 || inorder.length ==0){
return null;
}而不能是这样的
//1. 首先考虑递归中止条件
if(preorder == null || inorder == null){
return null;
}