查看: 2014| 回复: 4
跳转到指定楼层
上一主题 下一主题
收起左侧

[树/链表/图] 求问关于dfs的问题:什么时候引入helper?怎么设定返回值?

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
刷题对于我来说就是个玄学。
我理解是需要额外variable的时候需要引入helper function。
但是对于什么该怎么设定dfs的返回值,什么时候设定返回值,一直都很困惑。

拿二叉树举例:

以144 Binary Tree Preorder Traversal举例:
https://leetcode.com/problems/binary-tree-preorder-traversal/
题目要的结果是个list,我会写一个helper,然后在主function 的倒数第二步call 我的helper, 最后return list。
这种情况下我的helper里不会有return,只对list进行append。

如果题目是要的结果是tree或者node,我一般就直接进行recursive最后return root,不写helper function,
如题目226, invert binary tree
https://leetcode.com/problems/invert-binary-tree/description/

请问大佬们,我的理解是对的吗?还有什么其他的情况吗?

评分

参与人数 2大米 +3 收起 理由
capricornhx + 1 很有用的信息!
14417335 + 2 给你点个赞!

查看全部评分


上一篇:AWS 考试语言切换
下一篇:分享一些文科生转码上岸刷题学习心得
全局:
带return可以认为都是分治法,换句话说,如果我想要解决根结点的问题,我必须先解决了左右子节点,不带return的解决思路大部分都是反过来,先解决根结点的问题,然后再递归解决左右子节点
回复

使用道具 举报

全局:
本帖最后由 1mu3fen-2023 于 2023-2-20 23:06 编辑

最近也有类似的问题做了一些整理,但是我还不知道helper函数是什么,请给一个LeetCode的具体题解举例指教?

以下是我整理的笔记

感觉递归/树的问题可以做如下划分:
模式一、向子问题(子树)要信息
   dfs函数会return这个信息给调用者
   1.1 如果是在天然存在树的数据结构上做算法,通常是没有重复调用的,递归到叶子结点即可
   1.2 如果是由子问题形成的树形结构(例如斐波那契数),往往存在重复调用,用备忘录法(记忆化搜索)来剪枝


模式二、向子问题(子树)传递信息
  这种情况下,越往叶子方向状态(状态 == 从root到当前节点的路径)越累加,没有重复调用的问题。
  这种模式下,dfs函数通常不需要return语句(除了最后提到的剪枝目的)
  需要考虑向子问题传递的方式问题:
  A. 可以用string类型的参数传递信息,会自动进行浅拷贝
  B. 用List类型的参数传递,在编程语言里通常是传引用,调用dfs完毕后的下一行代码要记得pop,不论这个dfs最终是否得到了一个解

模式二又分为两种情况:
  2.1 需要执行到全部叶子结点
    这类问题要考虑收集答案的方式:把符合条件的结果append到一个全局的List里,这个List可以是传引用的参数,也可以是外部的一个全局变量
  2.2 不必执行到每个叶子状态,找到一个符合条件的叶子结点即可
   典型题目是解数独,这类题目往往在代码中体现两类剪枝行为:
   剪枝1:还没到叶子的时候就已经验证不符合条件,提前结束,就是所谓的“回溯”
   剪枝2:dfs 函数本身设计成会return True / False,如果return True,就会一路return到最上层调用,不会走完树的所有路径

评分

参与人数 2大米 +3 收起 理由
14417335 + 2 给你点个赞!
kuailenanhai + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

推荐
invisibili 2023-2-21 02:44:37 | 只看该作者
全局:
先把递归关系想清楚,最好用数学公式写出来。主函数的参数匹配公式时,你自然就不用helper,不匹配才用。返回值都可以看成一个特殊参数

评分

参与人数 2大米 +2 收起 理由
as535364 + 1 赞一个
kuailenanhai + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
jasonde 2023-2-21 02:26:21 | 只看该作者
全局:
dfs我觉得更重要的是理解recursion的思路,也可以用stack写. 可以看看这个https://leetcode.com/explore/featured/card/recursion-i/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表