You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++构建二叉树代码特定输入场景下未读取最后一个输入值是什么原因

问题根因

核心问题是空指针解引用导致程序异常终止,输出缓冲区未刷新,最后打印的内容丢失。

  • 你的代码中第二个for循环会遍历前floor(n/2)个节点,直接对vec[i]执行指针解引用操作设置左右孩子,没有判断vec[i]是否为NULL。
  • 第一个测试用例输入为3 1 4 0 0 2 0时,前3个节点(索引0、1、2)的值都不为0,vec[i]均为有效指针,循环正常执行,所有打印内容随着最后的cout << '\n'刷新缓冲区输出,结果符合预期。
  • 第二个测试用例输入为3 0 1 0 0 2 0时,索引为1的节点值为0,vec[1] = NULL,当循环执行到i=1时,vec[i]->left属于空指针解引用,直接触发程序崩溃。此时第一个循环已经读完了全部7个输入值,但最后一个0的打印内容还停留在输出缓冲区中没有刷新到终端,所以最终只输出了前6个字符301002。
修复方案

修改第二个for循环,增加空节点判断,跳过空节点的左右孩子设置操作即可,同时可以去掉不必要的floor()调用,C++中整数除法对正整数的效果和floor(n/2)完全一致:

for(int i = 0; i < n/2; i++ )
{
    // 空节点不需要设置左右孩子,直接跳过
    if (vec[i] == NULL) {
        continue;
    }
    vec[i]->left = vec[2*i+1];
    vec[i]->right = vec[2*i+2];
}

如果需要避免输出缓冲带来的debug干扰,可以将打印输入的语句修改为强制刷新缓冲:

cout << curr_inp << flush;

内容的提问来源于stack exchange,提问作者mizookie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 11:27:04