找到最大路径总和,我们可以在二叉树的任何节点中开始和结束

时间:2015-03-14 06:20:19

标签: c++ algorithm

这里是问题链接https://leetcode.com/problems/binary-tree-maximum-path-sum/,我的解决方案是我可以从树转换为数组,所以我采用预订树步行,我参考kadane的算法来查找数组中的最大值,这是我的代码,当我运行程序时,结果总是为零,但在我的意见中,它应该是正确的,我无法弄清楚为什么它不起作用,顺便说一下,问题提示是使用dfs ,我不熟悉dfs,任何人都可以通过使用dfs方法在这个问题上提供一些思考,告诉我如何学习dfs,任何论文或笔记,视频都可以,提前感谢!

 int maxPathSum(TreeNode *root) {
  vector<int>res;
  int max;
  if (root){
      res.push_back(root->val);
      maxPathSum(root->left);
      maxPathSum(root->right);
  }
  else{
      return 0;
  }
  max = maxpathsum1(res);
  return max;
}
int maxpathsum1(vector<int>&res){
    int cur,max;
    int len = res.size();
    cur = 0;
    max = 0;
    for (int i=0;i<len-1;i++){
        cur = cur+res[i];
        if (cur<0){
            cur = 0;
        }
        if (max<cur){
            max = cur;
        }
    }
    return max;
}

1 个答案:

答案 0 :(得分:0)

dfs是一种遍历树中所有节点的算法(更常见的是在图中),因此它确实适合您的问题。 您可以运行dfs算法,同时将左子树和右子树之间的最大路径求和+根节点本身。 你可以在Coreman的"Introduction to Algorithms"书中找到更多关于dfs的内容。

关于你的(非常相似)解决方案,你没有在&#34; maxPathSum&#34;中使用递归的返回值。功能。您应该在&#34; root-&gt; left&#34;上调用递归后返回此值。和&#34; root-&gt;对&#34;,验证它们是正数并将它们加入到某些&#34; max2&#34;变量并使用它。