递归算法的注意要点

递归三要素

  1. 递归函数中的参数和返回值
  2. 终止条件
  3. 每层循环的步骤

递归中,如何判断在每层循环时,是否需要判断该层是否为空的情况?

  • 若终止条件处理了为空的情况,就不用处理。
  • 否则就需要考虑该层是否为空,不为空才进行操作

递归中如何判断递归函数需要返回值


  1. 如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不需要返回值
  2. 如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需要返回值
  3. 如果要搜索其中一条符合条件的路径,那么递归一定需要返回值,因为遇到了符合条件的路径就要及时返回

如果递归函数有返回值,如何区分要搜索一条边,还是搜索整个树呢?

搜索一条边的写法:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值