unordered_map<int, vector<int>> tree;
void BFS() {
//找出所有的头节点
vector<int> h = allHeadNode();
int count = 0;
for (int k = 0; k < h.size(); k++) {
//添加新的节点
blocks[h[k]]->parent.push_back(make_pair(MAX_BLOCK_COUNT + EXTENDED_NODE_COUNT, blocks[h[k]]->id));
EXTENDED_NODE_COUNT++;
//创建队列,存放BFS依次遍历的元素
queue<Block*> Q ;
//P数组用于放到最终的结果中
vector<int> P;
//block[h[k]]表示树的头节点
Block* Vn = blocks[h[k]];
Q.push(blocks[h[k]]);
while (!Q.empty() ) {//队列不为空,继续搜索!
//取出队列的头Vn
Vn = Q.front();
//按照一定的条件将元素放到P中
if (blocks[Vn->id]->children.empty())
P.push_back(Vn->id);
//从队列中移除
Q.pop();
int i = 0;
//循环放入孩子节点
while (i < Vn->children.size()) {
Q.push(blocks[Vn->children[i].first]);
i++;
}
}
//用无序map存放每一个除头节点之外的节点,每棵树对应一个map
tree.emplace(count, P);
count++;
for (auto j = 0; j < P.size(); j++ ) {
blocks[P[j]]->children.push_back(make_pair(MAX_BLOCK_COUNT + EXTENDED_NODE_COUNT, blocks[P[j]]->id));
}
EXTENDED_NODE_COUNT++;
//打印出来
for (auto i = tree.begin(); i != tree.end(); ++i) {
for (auto j = 0; j < i->second.size();j++) {
cout << i->first<< " " << i->second[j] << " ";
}
cout << endl;
}
P = vector<int>();
}
}
针对多个多叉树BFS进行广度搜索
最新推荐文章于 2022-12-18 10:45:07 发布