使用vector作为输入实现BST类时根节点始终为NULL问题求助
问题定位与修复方案
核心问题:指针值传递导致root赋值不生效
insert函数的第一个参数Node* r是值传递的指针,函数内部修改的只是指针的本地副本,不会修改BST类的成员变量root本身。第一次插入节点时仅修改了本地指针r的指向,类成员root始终保持初始的NULL值,这是你遇到的根因。
其他隐藏问题
- 内存泄漏:进入
insert函数就直接新建节点,若本次插入需要递归到子节点,当前函数内新建的节点会被丢弃,没有释放也没有被挂载到树上。 - 逻辑冗余:空节点赋值后没有直接返回,后续会执行无意义的数值比较逻辑。
修复代码
仅需调整insert函数的参数为指针引用,同时调整节点新建的时机即可:
// 修改后的insert函数 void insert(Node* &r, int data) { // 只有找到空插入位置时才新建节点 if (r == NULL) { r = new Node(data); return; } if (data < r->data) { insert(r->left, data); } else if (data > r->data) { insert(r->right, data); } // 值相等的情况直接跳过,无需重复插入 return; }
修复后运行代码即可正常得到BST的中序遍历结果,你可以根据需求调整print_t函数中空节点的打印逻辑。
内容的提问来源于stack exchange,提问作者tblaze
相关产品推荐
相关产品推荐

