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

C++ 求最大路径和,我们可以在二叉树的任何节点中开始和结束,c++,algorithm,C++,Algorithm,这是问题链接,我的解决方案是我可以从一棵树转换成一个数组,所以我采用预排序树遍历,我参考kadane的算法来找到数组中的最大值,这是我的代码,当我运行程序时,结果总是为零,但在我的选项中,它应该是正确的,我不明白为什么它不起作用,顺便说一下,问题提示是使用dfs,我不熟悉dfs,有人能提供一些使用dfs方法在这个问题上的想法,并告诉我如何学习dfs好,任何论文或笔记,视频都可以,提前谢谢 int maxPathSum(TreeNode *root) { vector<int>r

这是问题链接,我的解决方案是我可以从一棵树转换成一个数组,所以我采用预排序树遍历,我参考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;
}
int maxPathSum(TreeNode*root){
向量机;
int max;
如果(根){
res.push_back(root->val);
maxPathSum(根->左);
maxPathSum(根->右);
}
否则{
返回0;
}
max=maxpathsum1(res);
返回最大值;
}
int maxpathsum1(向量和分辨率){
int cur,max;
int len=res.size();
cur=0;
max=0;

对于(inti=0;idfs是一种遍历树中所有节点的算法(通常在图中),因此它确实适合您的问题。 您可以只运行dfs算法,同时每次将左子树和右子树之间的最大路径加上根节点本身相加。 你可以在Coreman的书中找到更多关于dfs的内容


关于您(非常类似)的解决方案,您没有在“maxPathSum”函数中使用递归的返回值。您应该在“root->left”和“root->right”上调用递归后获取返回的这些值,验证它们是否为正,并将它们相加为一些“max2”变量并使用它。

dfs=depth-first search。在谷歌上点击9000万次,可能是一个很好的开始