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

C++二叉树路径追踪程序root == NULL判断条件不生效问题求解

问题原因分析
  • TreeNode节点的左右指针未初始化
    代码中所有通过new创建的TreeNode实例,没有对left、right成员做初始化操作,二者的值都是随机的野指针,而非NULL。递归遍历到叶子节点的子节点时,传入getPosition的root参数是随机非法地址,自然无法触发if(root == NULL)的判断,还会导致非法内存访问,程序行为完全不可预期。
  • condition指针未初始化,属于野指针
    getDirections函数中只声明了bool *condition;但没有为其分配合法内存地址,就直接执行*condition = false;解引用操作,属于未定义行为,会随机修改内存中的值,导致getPosition中found的判断逻辑完全失效,进一步干扰递归流程。
修复方案

首先修改TreeNode结构体,添加构造函数自动初始化指针:

struct TreeNode {
  int val;
  TreeNode *left;
  TreeNode *right;
  // 添加构造函数,默认将左右指针初始化为空
  TreeNode(int v) : val(v), left(nullptr), right(nullptr) {}
};

然后修改main函数中节点创建的逻辑,使用新的构造函数:

int main() {
  TreeNode* root = new TreeNode(5);
  root->left = new TreeNode(1);
  root->left->left = new TreeNode(3);
  root->right = new TreeNode(2);
  root->right->left = new TreeNode(6);
  root->right->right = new TreeNode(4);
  cout<<root->right->right->val;
  string s = getDirections(root, 3, 6);
  cout<<s;
  // 可补充内存释放逻辑避免内存泄漏
  return 0;
}

再修改getDirections中的condition变量,不要直接声明指针,改为栈上的bool变量,传入地址即可:

string getDirections(TreeNode* root, int startValue, int destValue) {
    string Answer;
    vector<bool> start;
    vector<bool> end;  //left = true and right = false;
    // 改为栈上变量,避免野指针问题
    bool condition = false;
    getPosition(root, startValue, start, &condition);
    condition = false;
    getPosition(root, destValue, end, &condition);
    // 其余原有逻辑保持不变
    ...
}
其他优化建议
  • C++11及更高版本推荐使用nullptr代替NULL表示空指针,避免宏定义带来的类型问题。
  • 程序结束后需要手动释放所有new出来的TreeNode节点,避免内存泄漏。
  • 可以对getPosition函数补充入参合法性判断,避免传入空root的异常情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:24:02