为什么我的 while 循环没有采用此特定示例用户输入中的最后一个值?

Why is the last value in this specific example user input not being taken for my while loop?

我遇到一个错误,在从 while 循环接收用户输入后,我的代码不接受最后一个值。这个错误发生在一个具体的例子上,我不知道为什么会这样。

因此,例如,用户输入:

7  
3 1 4 0 0 2 0

输出为:

3140020

HOWEVER,用户输入如下(这是具体示例):

7  
3 0 1 0 0 2 0

输出应该是:

3010020

BUT,输出为:

301002

我完全想不通。代码附在下面:

#include <iostream>
#include <vector>
#include <math.h>
using namespace std;

// Definition for a binary tree node.
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(NULL), right(NULL)  {}
    TreeNode(int x) : val(x), left(NULL), right(NULL)  {}
};

TreeNode* construct_tree(){
    int n;
    cin >> n;
    int curr_inp;
    vector<TreeNode*> vec;
    for (int i = 0; i < n; i++) {
        cin >> curr_inp;
        cout << curr_inp; // **this is the place of bug**
        if (curr_inp != 0) 
            vec.push_back(new TreeNode(curr_inp));
        else 
            vec.push_back(NULL);
    }

    for(int i = 0; i< floor(n/2);i++ )
    {
        vec[i]->left = vec[2*i+1];
        vec[i]->right = vec[2*i+2];
    }
    cout << '\n';
    return vec[0];
}

int main() {
    TreeNode* root = construct_tree();
    return 0;
}

您的 construct_tree() 函数在其第二个 for 循环中崩溃。这阻止了写入 cout 的最后一个字符的输出,因为 cout 输出默认情况下是缓冲的,并且最后一个字符仍在缓冲区中并且尚未刷新到控制台时发生崩溃。

cincout 默认情况下 tie() 在一起,因此从 cin 读取输入将首先隐式刷新 cout,但是有在第一个 for 循环的最后一次迭代写入 cout.

之后,没有从 cin 读取数据

在第一个 for 循环完成后,在进入第二个 for 循环之前,尝试添加对 cout << flushcout.flush() 的调用。或者在第一个 for 循环中使用 cout << curr_inp << flush;。然后你会看到显示的最后一个字符。

然后,您需要修复崩溃。

问题不在cout << curr_inp;问题在你使用的循环

    for(int i = 0; i< floor(n/2);i++ )
    {
        vec[i]->left = vec[2*i+1];
        vec[i]->right = vec[2*i+2];
    }

您正在尝试使用空向量

调用 leftright

添加空检查后没有分段错误

    for(int i = 0; i< floor(n/2);i++ )
    {
        if (vec[i]) {
            vec[i]->left = vec[2*i+1];
            vec[i]->right = vec[2*i+2];
        } else {
            cout << "nullptr \n";
        }
    }

现在当我使用

7
3 0 1 0 0 2 0

我得到了以下输出

7
3 0 1 0 0 2 0
3010020nullptr 

结论:我不知道你的逻辑是什么,但问题是因为取消引用nullptr