- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经解决了很多与树有关的问题,但是,我仍然对树的一个特定方面(一般递归)没有信心:
How do you propagate values from the leaf to the root?
例如,假设我们有一棵二叉树,其中我们必须找到具有最小总和的根到叶的路径。对于 TreeMap 像 here ,总和将为 7
(对应于两条路径 0-3-2-1-1 或 0-6-1)。
我写了下面的代码:
struct Node
{
int cost;
vector<Node *> children;
Node *parent;
};
int getCheapestCost( Node *rootNode )
{
if(!rootNode) return 0;
return dfs(rootNode, INT_MAX, 0);
}
int dfs(Node* rootNode, int minVal, int currVal) {
if(!rootNode) return;
currVal+=rootNode->cost;
if(rootNode->children.empty()) {
minVal = min(minVal, currVal);
return minVal;
}
for(auto& neighbor: rootNode->children) {
dfs(neighbor, minVal, currVal);
}
return currVal; //this is incorrect, but what should I return?
}
我知道最后一个 return currVal
是不正确的 - 但我应该返回什么?从技术上讲,我只想在到达叶节点时返回 minVal 的值(在中间节点时不返回任何值)。那么,如何将 minVal
从叶节点传播到最顶层的 root
节点?
P.S.:我正在准备面试,这对我来说是一个很大的痛点,因为我几乎每次都卡在这一点上。我将不胜感激任何帮助。谢谢。
编辑:对于这个特别的,我以某种方式 wrote a solution使用引用传递。
最佳答案
在您的 for 中保存所有 child 的 minVal 并返回 minVal 而不是 currVal。
for(auto& neighbor: rootNode->children) {
minVal = min(minVal, dfs(neighbor, minVal, currVal));
}
return minVal;
这样你总是会返回 minVal,通过递归一直到第一次调用。
编辑:解释
我将使用 tree你在你的问题中提供了一个例子。我们将从在根 (0) 处进入树开始。它会给currVal加0,不会输入第一个if,然后输入for。一旦它在那里,该函数将从第一个 child 再次调用。
在第一个节点 (5),它会添加那个值,检查它是否结束,然后转到下一个节点 (4),再次添加,currVal 现在是 9。然后,因为 (4) 没有 children ,它将返回 min(currVal, minVal)。此时minVal为INT_MAX,所以返回9。
一旦这个值被返回,我们回到调用它的函数,它在节点(5),恰好在我们调用(4)的时候,我们将(通过我的修改)比较哪个值它返回了 minVal。
min(minVal, dfs(neighbor, minVal, currVal))
在这一点上,重要的是要注意当前的 minVal 仍然是 INT_MAX,因为它不是一个引用,这是传递给函数的值。因此,我们现在将其设置为 9。
如果 (5) 有其他 child ,我们现在将输入 dfs 的新实例,一旦我们有结果,将该值与 9 进行比较,但由于我们没有,我们结束 for 循环并返回 minVal,回到根节点 (0)。
从那里,我相信你可以猜到会发生什么,我们进入节点 (3),它分支到 (2)->(1)->(1) 和 (0)->(10),返回 7 和 13分别到 for 循环,节点 (6) 最终也会将 7 返回到 (0) 的 for 循环。
最后,(0) 将首先将 INT_MAX 与 9 进行比较,然后与 7 进行比较,最后再次与 7 进行比较,将 7 返回给 getCheapestCost。
简而言之:
您的代码将一直进入 dfs 直到它找到一个没有子节点的节点,一旦发生这种情况,它将返回从该节点获得的 minVal,然后返回到调用它的函数,即父节点。
一旦进入父节点,您需要检查哪些子节点提供了最小 minVal,方法是将其与您之前的 minVal(来自其他子节点、分支或 INT_MAX)进行比较.检查完所有子节点后,minValue 返回给下一个父节点,下一个父节点与它的子节点进行比较,直到到达根节点。
关于c++ - 将值从叶传播到根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49246363/
如果有人能解释这个注释的作用以及我们何时使用它: @Transactional(propagation=Propagation.REQUIRED) 谢谢 最佳答案 如果您需要在 Spring Docs
我有一个页面,它有一个 keydown 事件监听器,用于监听 Escape 键,以便返回。我还有一个简单的模态类,它也监听 Escape 键以关闭它。主页监听器检查模式是否打开,如果打开,则不执行任何
我想在模型中设置默认变量名称 T (=xx) - 将该模型拖到新模型中并在其中定义变量 xx。我收到错误消息:使用未声明的变量 xx。 这是子模型 model test parameter Rea
在 android 2.x 浏览器中查看此示例..它是在我的应用程序中复制场景的示例.. http://johnchacko.net/samples/tap.html 它是关于监听“tap”并从监听器
如您所见,我正在尝试将 GatewayConnectionFailedException 传播到我的 UI。我希望此代码捕获除异常之外的所有内容,我希望表示层捕获该异常以通知用户数据库是问题所在,以便
我目前正在尝试让可执行文件与它需要的所有依赖项正确链接。 这是依赖项的示例结构: exe -> libA -> libB exe和 libA有自己的存储库。 exe拉入libA像这样的东西: add_
有什么方法可以调用带有单个参数的 Scala 函数,给定一个数组 (类似于 JavaScript Spreads在 ECMAScript 6) 中? ys = [10.0, 2.72, -3.14]
我有一个小型静态库,它需要 boost 头文件,并且需要包含目录中的“include”目录。 ... add_library(alib STATIC ...) target_include_direc
我有一些 promise 可以返回对象。 现在我想将它们合并/扩展为一个新对象,因此我使用 Lodash's extend . var whenEverythingIsDone = Promise.a
这是我认为人们通常希望在 Scala 中做的事情,但如果我能在任何地方找到一个例子,我就该死了。 这段代码由于类型删除而无法编译,但它演示了我正在努力完成的事情: def parse[T](json:
这是我认为人们通常希望在 Scala 中做的事情,但如果我能在任何地方找到一个例子,我就该死了。 这段代码由于类型删除而无法编译,但它演示了我正在努力完成的事情: def parse[T](json:
我们有大量 MOSS 2007 站点需要添加大量的 javascript。我编辑、 checkin 、发布并批准了对 default.master 的更改,更改反射(reflect)在根网站上,但没有
请看一下下面的 fiddle :http://jsfiddle.net/K9NjY/ 我在这段代码上花了 3-4 个小时,并将其缩小到最短的版本,但现在我陷入了困境。 问题:1. 点击“divOne”
我读到如果在流程中抛出异常,框架要做的第一件事就是检查消息头中的错误 channel 属性。总是这样吗? 在我的特殊情况下,我将自定义错误 channel 分配给消息 header ,但该消息似乎已向
创建一个小的 C++ 大型精度类,一切似乎都运行良好,但是添加,如果我将 0xffffffff 和 0x04 加在一起,我会得到 0xffff0003,而我应该得到 0x0100000003。这是有问
我正在尝试重新创建 Dan Abramov 类(class)中的 Redux 示例。传播{...store.getState()}在应用程序级别不起作用,Redux 正在更改状态并且 React 不会
考虑一个需要很长时间的事务。在此期间,我想对 TableSmall 执行一些小更新。 ,它应该立即执行,并且主事务的回滚不应该回滚那些小的更新。 我当前的问题是这些小更新将锁定 TableSmall\
我需要对现有函数进行修改,具有一些 const 输入参数: int f(const owntype *r1, const owntype *r2) 为了做到这一点,我想调用一个使用相同类型但没有 co
我有一个带有 ViewModel 的 WPF UserControl: 这个 UserControl 有一个 De
我试图在收到这样的短信时不传播 public class SMSReceiver extends BroadcastReceiver { @Override public void onRec
我是一名优秀的程序员,十分优秀!