C++用智能指针实现BST的BFS功能时队列push报错如何解决
问题诊断
你的理解完全正确。你声明的queue<TreeNode>的元素类型是TreeNode实体对象,而执行push操作时传入的是shared_ptr<TreeNode>智能指针类型,二者没有隐式转换规则,因此编译器抛出类型不匹配错误。
解决方案
只需要将队列的元素类型修改为shared_ptr<TreeNode>即可,修改后的BFS函数代码如下:
template<typename T> void BST<T>::bfs(shared_ptr<TreeNode>& root) { if(root == nullptr) return; // 仅修改队列声明行,存储智能指针而非TreeNode实体 queue<shared_ptr<TreeNode>> bfsqueue; bfsqueue.push(root); while (!bfsqueue.empty()) { shared_ptr<TreeNode> current = bfsqueue.front(); bfsqueue.pop(); cout<<current->data<<" "; if (current->left != nullptr) { bfsqueue.push(current->left); } if (current->right != nullptr) { bfsqueue.push(current->right); } } }
补充优化建议
- 由于BFS遍历不会修改节点指针本身,可将函数参数改为
const shared_ptr<TreeNode>& root,符合const正确性规范。 - 尽量避免在头文件使用
using namespace std;,防止命名空间污染。
内容的提问来源于stack exchange,提问作者pythonc229
相关产品推荐
相关产品推荐

