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
相关产品推荐
相关产品推荐

