图深拷贝问题:BFS函数中visited哈希表未更新排查
图深拷贝代码问题修复
核心错误点
你提到的BFS函数中visited哈希表无法更新的问题,原因很直接——用了未初始化的temp_val变量:
原代码里的错误行:
visited.insert(std::make_pair(temp_val,true)); //does not get updated
temp_val是未赋值的局部变量,根本没关联到当前要标记的节点值,导致visited完全无法记录新节点的访问状态。
修正方案
把这行改成使用当前原节点的val(或拷贝后的节点值,两者值一致):
visited.insert(std::make_pair(temp_node->val, true));
额外提示(不影响核心问题定位,但能让代码正常工作)
除了上述核心错误,还有两处细节问题会导致深拷贝失效:
- BFS和
new_neigbors函数中的indexer是按值传参,会生成副本,原函数的映射表无法同步更新,需改成引用传递:std::unordered_map<Node*,Node*>& indexer - 初始化新节点时直接传入原节点的
neighbors属于浅拷贝,应先初始化空邻居列表,后续再替换为克隆后的节点
修正后的BFS关键片段
void BFS(Node* node, std::unordered_map<Node*,Node*>& indexer){ std::unordered_map<int,bool> visited; std::vector<Node*> output_nodes; output_nodes.push_back(node); visited.insert(std::make_pair(node->val, true)); Node* temp_node; Node* temp_node_2; for(int i = 0 ; i < output_nodes.size() ; i++){ for(int j = 0 ; j < output_nodes.at(i)->neighbors.size(); j++){ temp_node = output_nodes.at(i)->neighbors[j]; if(!visited[temp_node->val]){ temp_node_2 = new Node(temp_node->val); // 初始化空邻居列表 indexer.insert({temp_node,temp_node_2}); output_nodes.push_back(temp_node_2); // 修正后的visited更新逻辑 visited.insert(std::make_pair(temp_node->val, true)); } } } new_neigbors(indexer, node, output_nodes); }
内容的提问来源于stack exchange,提问作者BITE004 Mir Aatif
相关产品推荐
相关产品推荐

