【问题标题】:Passing value from vector pair of struct pointer to function将结构指针向量对的值传递给函数
【发布时间】:2020-08-17 15:08:56
【问题描述】:

该代码是关于查找由边连接节点的树的直径。当我调用直径函数时,我遇到了问题。它编译没有错误,但是当我运行代码时,代码在调用直径函数后停止执行。

#include <bits/stdc++.h>
using namespace std;
struct Node {
    int data;
    struct Node* left,*right;
};

int height(struct Node* node){
    if(node==NULL) return 0;
    else return max(height(node->left),height(node->right))+1;
}
int diameter(struct Node* node){
    if(node==NULL){
       return 0;
    }
    int left_height=height(node->left);
    int right_height=height(node->right);
    return max(left_height+right_height+1,max(diameter(node->left),diameter(node->right)));

}

int main(){
    int n,t1,t2;
    cin>>n;
    vector<pair<int,int>>v;
    for(int i=1;i<n;i++){
        cin>>t1>>t2;
        v.push_back({t1,t2});
    }
    vector<pair<struct Node*,struct Node*>>v2;
    for(int i=0;i<n-1;i++){
        struct Node* node1=new Node,*node2=new Node;
        node1->data=v[i].first; node2->data=v[i].second;
        node1->left=NULL; node2->right=NULL;
        node1->right=node2; node2->left=node1;
        v2.push_back({node1,node2});
        // v2[i].first=node1; v2[i].second=node2;
    }
    cout<<"hei"<<endl;
    for(int i=0;i<(signed)v2.size();i++){
        cout<<v2[i].first->data<<" "<<v2[i].second->data<<endl;
    }
    // return 0;
    int dia=0,maxdia=0;
    for(auto it : v2){
        dia=diameter(it.first);
        if(dia>maxdia) maxdia=dia;
        dia=diameter(it.second );
        if(dia>maxdia) maxdia=dia;
    }
    cout<<endl;
    cout<<"anything"<<endl;

    cout<<maxdia<<endl;
    return 0;
}

/* inputs 
//Input1
3
3 2
2 1
//Input2
5
4 2
1 4
5 4
3 4

*/

直径功能通过手动输入可以正常工作


struct Node* NewNode(int data){
    struct Node* node=new Node();
    node->data=data;
    node->left=NULL; node->right=NULL;
}

int main(){
    struct Node* root= NewNode(1);
    root->left=     NewNode(2);
    root->right=    NewNode(3);
    root->left->right=    NewNode(4);
    root->left->left=     NewNode(5);
    // root->right->left=    NewNode(6);
    root->left->left->right=    NewNode(7);
    root->left->right->right    =NewNode(8);
    root->left->right->right->left    =NewNode(9);
    root->left->right->right->left->right    =NewNode(10);
    cout<<diameter(root)<<endl;
    return 0;
}

【问题讨论】:

  • 它编译没有错误,但是...... -- 编译没有错误只是意味着没有语法错误。该程序仍然可能有逻辑错误。这就是 调试 完成的地方。你对程序做了哪些调试?
  • 我正在考虑将迭代节点作为根节点,以便找到树的最大直径。没有固定的根节点。
  • 你的两个例子似乎使用了不同的树。
  • 失败的测试输入是什么?此外,您应该获取代码并在您拥有的编译器上进行本地调试。调试自己的代码是学习如何编写程序的一部分。您不应该依赖网站和以前的答案 - 您应该获取代码,使用调试器逐步完成它,并亲自查看缺陷在哪里。然后,一旦您发现缺陷在哪里,您就可以自己修复它,或者向我们提供您在逻辑中发现的缺陷的详细信息并建议如何解决它。
  • 那是你误会的地方。如果代码编译时没有错误或警告,这意味着没有错误/警告。这与您是否犯了逻辑错误无关。如果我让你编写一个程序来添加两个数字,而不是减去这些数字,程序将编译而不会出现任何错误。程序是否正确?没有。

标签: c++ pointers struct


【解决方案1】:

这个函数:

int height(struct Node* node){
    if(node==NULL) return 0;
    else return max(height(node->left),height(node->right))+1;
}

如果你在循环图上调用它会进入无限递归,像这样:

...
node1->right=node2; node2->left=node1;
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多