Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我的逻辑正确吗?这是一个错误_C++_C_Recursion_Binary Tree_Depth First Search - Fatal编程技术网

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