当前位置: 首页 > 知识库问答 >
问题:

将值从叶传播到根

鞠嘉志
2023-03-14

我已经解决了很多与树相关的问题,但是,我仍然对树的一个特定方面(通常是递归)没有信心:

如何将值从叶传播到根?

例如,假设我们有一个二叉树,其中我们必须找到具有最小和的根到叶路径。对于此处的树图像,总和将为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?
}

我知道最后一次返回的货币不正确,但是我应该返回什么?从技术上讲,我只想在到达叶节点时返回minVal的值(在中间节点时没有值)。那么,如何将minVal从叶节点传播到最顶部的根节点呢?

P、 美国:我正在准备面试,这对我来说是一个很大的痛苦领域,因为我几乎每次都被困在这一点上。如果有任何帮助,我将不胜感激。谢谢

编辑:对于这一个,我不知何故编写了一个使用引用传递的解决方案。

共有1个答案

华宪
2023-03-14

在您的for中保存所有子级的minVal并返回minVal而不是currVal。

for(auto& neighbor: rootNode->children) {
  minVal = min(minVal, dfs(neighbor, minVal, currVal));
}
return minVal;

这样,您总是通过递归返回minVal,一直到第一次调用。

编辑:解释

我将使用您在问题中提供的树作为示例。我们将从在根(0)处输入树开始。它会将0添加到currVal,不会输入第一个if,然后输入for。一旦它出现,该函数将从第一个子级再次调用。

在第一个节点(5),它将添加该值,检查它是否是结束,然后转到下一个节点(4),再次添加,currVal现在是9。然后,由于(4)没有子项,它将返回min(currVal,minVal)。此时,minVal是INT\u MAX,因此它返回9。

一旦返回这个值,我们就返回到调用它的函数,它位于节点(5),正好在我们调用(4)的时候,我们将(经过修改)将它返回的值与minVal进行比较。

min(minVal, dfs(neighbor, minVal, currVal))

此时,需要注意的是,当前minVal仍然是INT\u MAX,因为它不是引用,而这是传递给函数的值。因此,我们现在将其设置为9。

如果(5)有其他子节点,我们现在将输入一个新的dfs实例,一旦我们有了结果,将该值与9进行比较,但由于我们没有,我们结束for循环并返回minVal,返回根节点(0)。

从那里,我相信你可以猜到会发生什么,我们输入节点(3),它分支到(2)-

最后,(0)将首先将INT_MAX与9进行比较,然后与7进行比较,最后再次与7进行比较,返回7以获得最便宜的成本。

简而言之:

您的代码将继续输入dfs,直到找到一个没有子节点的节点,一旦发生这种情况,它将返回从该节点获得的minVal,并返回调用它的函数,即父节点。

进入父节点后,需要通过将最小值与之前的最小值(来自其他子节点、分支或INT_MAX)进行比较来检查哪些子节点提供了最小最小值。检查完所有子节点后,minValue返回给下一个父节点,该父节点与其子节点进行比较,直到到达根节点。

 类似资料:
  • 我正在尝试将某些值从servlet传递到JSP页面,并添加已传递到标记的值,阅读了许多文章,我得到了以下代码。 使用输入页面选择文件 验证上传的文件 调用上传。java将上传的文件保存在WEB-INF中 在上载的文件中,选定的文件保存为“我的”。txt 使用缓冲区读取文件内容并将其保存到变量 将其传递到JSP页面 上载JAVA 上传文件后, mypage.jsp 现在,当我点击上传按钮完成所有这些

  • 问题内容: 我在将值从JS传递到PHP时遇到问题,以便可以将其用作PHP函数的参数。一旦单击链接,JS函数将由onclick事件触发。这是JS + HTML代码: PHP(insert.php): 感谢您能为我提供帮助的人。我对PHP和JS还是很陌生,所以请原谅我的愚蠢。 问题答案: 您将数据从浏览器传递到服务器。Javascript是一种用于操纵浏览器的语言。PHP是您的服务器端语言。 您可以在

  • 我是反应性编程概念的新手。我正在学习“学习Spring Boot2.0”,所描述的简单概念/示例是可以理解的。但是我不知道如何在更复杂的用例中使用mono/flux。spring boot,mongo和project reactor的一些例子 我的模型

  • 问题内容: 我正在使用ExecutorService和Future(在此处为示例代码)在具有超时的单独线程中运行进程(线程“生成”发生在AOP Aspect中)。 现在,主线程是一个Resteasy请求。Resteasy使用一个或多个ThreadLocal变量来存储一些上下文信息,这些信息需要在Rest方法调用中的某个时刻检索。问题是,由于Resteasy线程在新线程中运行,因此ThreadLoc

  • 我正在使用TestNG执行单元测试,其中我正在使用xml文件中定义的测试用例测试我的代码。 我正在使用xml文件中定义的测试用例执行登录操作。但问题是我想在方法登录中以usersname和password的形式发送参数。 是否可以将值(用户名和密码)传递给执行测试用例的xml文件中的登录方法? 下面是我的XML文件 谢谢

  • 问题内容: 以下是我的html模板: 下面是我的代码: 为什么我会收到“ 未定义 ”而不是“ 某些消息 ” 下面是一个小提琴 http://jsfiddle.net/j2K7N/27/ 问题答案: 您的代码几乎是正确的,但是这里有几个问题: 在这里,您从控制器传递函数,该函数带有一个未定义的参数,该参数会导致警报消息带有“未定义”文本。我建议将HTML代码修改为: 请注意,我将传递为变量而不是函数