C++ 我的逻辑正确吗?这是一个错误
我想在二叉树中找到从根到叶的最大和。 最初我是这样做的:C++ 我的逻辑正确吗?这是一个错误,c++,c,recursion,binary-tree,depth-first-search,C++,C,Recursion,Binary Tree,Depth First Search,我想在二叉树中找到从根到叶的最大和。 最初我是这样做的:Answer=sum\u to\u leaf(根,0) 我知道探索所有路径并更新总和的全局最大值的另一种方法。我只是想这样做 int sum_to_leaf(struct node* root, int sum) { if(root == NULL) return sum; else if(root->left == NULL && root->right == NULL)
Answer=sum\u to\u leaf(根,0)代码>
我知道探索所有路径并更新总和的全局最大值的另一种方法。我只是想这样做
int sum_to_leaf(struct node* root, int sum)
{
if(root == NULL)
return sum;
else if(root->left == NULL && root->right == NULL)
{
sum = sum + root->data;
return sum;
}
else
{
sum = sum + root->data;
if(sum_to_leaf(root->left, sum) > sum_to_leaf(root->right, sum))
{
sum = sum + sum_to_leaf(root->left, sum);
}
else
{
sum = sum + sum_to_leaf(root->right, sum);
}
return sum;
}
}
你一定是建错树了。在某个地方,您正在访问一个未初始化的节点
,尽管根节点->
,但却遇到了seg故障。Mmm您确定seg故障来自该代码吗?你调试过了吗?
我宁愿试试这个:
int sum_to_leaf(struct node* root,int sum) {
if(root==NULL) {
return sum;
} else {
sum=sum+root->data;
int left_sum = sum_to_leaf(root->left, sum);
int right_sum = sum_to_leaf(root->right, sum);
return std::max(left_sum, right_sum); // need to #include <algorithm>
}
}
int sum_to_leaf(结构节点*根,int sum){
if(root==NULL){
回报金额;
}否则{
总和=总和+根->数据;
int left\u sum=和到叶(根->左,和);
int right\u sum=sum\u to\u leaf(root->right,sum);
return std::max(left_sum,right_sum);//需要包含
}
}
我想实现ur算法的更好方法是:
int getSum(struct node* nd)
{
if(nd==NULL)
return 0;
int sum_r = getSum(nd->right);
int sum_l = getSum(nd->left);
return nd->data + std::max(sum_r, sum_l);
}
我不知道出了什么问题,但无论如何,你不应该以同样的意图调用递归函数两次。将sum\u to\u leaf(root->left,sum)
和sum\u to\u leaf(root->right,sum)
存储到整数中,然后进行比较和赋值。我认为这里的人不会很好地回答那些要求逻辑正确性的问题。你可以运行你的程序,如果它不起作用,请寻求帮助,前提是你记录了什么不起作用。我看不出代码中有任何东西会导致分段错误。但是,它似乎只是代码的一小部分,因此segfault可能发生在其他地方。您需要进行一些调试,以缩小罪魁祸首的范围。我同意@Eregrith的观点,例如,两次调用sum\u to\u leaf(root->left,sum)
都是浪费。您应该调用它并保存值用于和。这是C还是C++?您有两个标记,但它们是不同的语言。类似的在某些方面是正确的,但是java和C++也是如此。@ ANJRUU使用Strut关键字强烈地暗示了C,但是也可能是C++,是由那些只学会Cyt忘记在你的返回中包含和的人编写的。代码>返回和+std::max(…)
erregrith没有必要这样做,因为左和右的和都已经包含了该值。哦,是的。。。很抱歉咖啡不够^^“@Eregrith认为你是对的。他在原始代码中添加了sum。不确定它是否正确,但它的作用是什么。那么原始代码中是错误的。想想看。如果你有根并调用sum\u to\u leaf(root->left,sum)
,则没有任何“root->left”,因此sum\u to\u leaf只返回sum
(首先是if
case)。我为什么要再次添加sum
?