递归三要素
- 递归函数中的参数和返回值
- 终止条件
- 每层循环的步骤
递归中,如何判断在每层循环时,是否需要判断该层是否为空的情况?
- 若终止条件处理了为空的情况,就不用处理。
- 否则就需要考虑该层是否为空,不为空才进行操作
递归中如何判断递归函数需要返回值?
- 如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不需要返回值
- 如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需要返回值
- 如果要搜索其中一条符合条件的路径,那么递归一定需要返回值,因为遇到了符合条件的路径就要及时返回
如果递归函数有返回值,如何区分要搜索一条边,还是搜索整个树呢?
搜索一条边的写法:
if (递归函数(root->left)) return ;
if (递归函数(root->right)) return ;
搜索整个树写法:
left = 递归函数(root->left); // 左
right = 递归函数(root->right); // 右
left与right的逻辑处理; // 中
递归中是否使用引用?
当该值递归到下一层时,若该值需要下一层中的信息在这层中使用或处理,那么就需要引用。否则不然
在返回值的递归函数中,需要注意每一行是否有返回值,是一定有返回值,而不是当满足哪一个条件下的返回值,例如以下没有返回值的
if (!cur) return cur;
if (cur->val >= p->val && cur->val <= q->val || cur->val <= p->val && cur->val >= q->val ){
flag = 1;
return cur;
}
TreeNode* leftnode, *rightnode;
leftnode = ancestor(cur->left, p, q);
rightnode = ancestor(cur->right, p, q);
if (leftnode) return leftnode;
if (rightnode) return rightnode;
//这种就没有返回值
//加上以下才行,且加上上诉是中间找到符合的公共节点就返回。不用额外担心返回多余的问题
return cur;
//其实这种是通过不了的,因为当一个节点的左孩子不是答案时,右孩子是答案的时候。其会先返回左孩子作为答案,因为都是返回节点,无法分辨哪个是答案,所以得额外加一个判定条件判断答案。具体看递归2