C++ 树路径的最大和是多少
这是极客对极客的提问。我写了我的答案,但它是错误的。我的逻辑有什么问题C++ 树路径的最大和是多少,c++,algorithm,C++,Algorithm,这是极客对极客的提问。我写了我的答案,但它是错误的。我的逻辑有什么问题 int path(Node *root, int & max_sum) { if(root==NULL) return 0; int l=path(root->left,max_sum); int r=path(root->right,max_sum); max_sum=max(max_sum,l+r+root->data); return max(l,r)+root-&
int path(Node *root, int & max_sum)
{
if(root==NULL)
return 0;
int l=path(root->left,max_sum);
int r=path(root->right,max_sum);
max_sum=max(max_sum,l+r+root->data);
return max(l,r)+root->data;
}
int maxPathSum(Node *root)
{
int max_sum=INT_MIN;
path(root,max_sum);
return max_sum;
// code here
}
问题陈述说 查找从一个叶节点到另一个叶节点的最大可能和 所以,当你这么做的时候
max_sum=max(max_sum,l+r+root->data);
您需要检查根目录是否同时包含两个子目录。否则,在最终答案中不会考虑这些问题
你也是
if(root==NULL) return 0;
及
由于0大于任何负整数,这两个值组合在一起将重写其值为负的单个叶节点子节点
因此,总体而言,您的代码应该如下所示:
int path(Node *root, int & max_sum)
{
if(root==NULL) return 0;
int l=path(root->left,max_sum);
int r=path(root->right,max_sum);
if(root->left != NULL && root->right != NULL){
max_sum = max(max_sum,l + r + root->data);
}
if(root->left != NULL && root->right == NULL) return l + root->data;
if(root->right != NULL && root->left == NULL) return r + root->data;
return max(l,r) + root->data;
}
int maxPathSum(Node *root)
{
int max_sum=INT_MIN;
path(root,max_sum);
return max_sum;
}
只是一个有根据的猜测:intl=path(root->left,max\u sum)代码>更改max_sum
;如果您希望在第二次调用int r=path(root->right,max\u sum)中出现max\u sum
收到与第一次调用相同的max_sum
值,那么您可能错了。请在问题中包含a。代码应该做什么?输入、输出和预期输出是什么?
int path(Node *root, int & max_sum)
{
if(root==NULL) return 0;
int l=path(root->left,max_sum);
int r=path(root->right,max_sum);
if(root->left != NULL && root->right != NULL){
max_sum = max(max_sum,l + r + root->data);
}
if(root->left != NULL && root->right == NULL) return l + root->data;
if(root->right != NULL && root->left == NULL) return r + root->data;
return max(l,r) + root->data;
}
int maxPathSum(Node *root)
{
int max_sum=INT_MIN;
path(root,max_sum);
return max_sum;
}