64,682
社区成员
发帖
与我相关
我的任务
分享
//递归
struct Record
{
int Id;
int ParentId;
}
void FindIdRescure(vector<int> &out,vector<Record> in, int ParentId) //此算法内存方面的细节可以优化,lz你忽视好了。
{
for(int i = 0;i<in.size();i++){
if(in[i].ParentId == ParentId)
{
out.push_back(in[i].Id);
FindIdRescure(out,in,in[i].Id);
}
}
int main()
{
vector<Record> list;
Record r21; r21.Id = 2 ; r21.ParentId = 1;
list.push_back(r21);
Record r31; r31.Id = 3; r31.ParentId = 1;
list.push_back(r31);
// ... 略;
vector<int> out;
FindIdRescure(out,list,1);
}
#include <iostream>
#include <vector>
#include <deque>
#include <future>
using namespace std;
vector<int> FindChildren(const vector<pair<int, int>> data, const int id)
{
vector<int> result;
vector<future<vector<int>>> futures;
for (auto& p : data)
{
//找到符合的数据,将其ID加入结果列表
if (p.second == id)
{
result.push_back(p.first);
//递归查找该ID的子ID,将递归结果缓存
futures.push_back(async(FindChildren, data, p.first));
}
}
//将递归结果加入结果列表
for (auto& f : futures)
{
for (auto& c : f.get())
{
result.push_back(c);
}
}
return result;
}
int main()
{
//数据
vector<pair<int, int>> data = { { 2, 1 }, { 3, 1 }, { 4, 1 }, { 5, 2 }, { 6, 3 }, { 7, 4 }, { 8, 4 } };
//待查ID队列
deque<int> ids = { 1 };
while (!ids.empty())
{
//取出队列尾部ID进行下一轮查找
const int id = ids.back();
ids.pop_back();
for (auto& p : data)
{
if (p.second == id)
{
//找到符合的数据,将其ID加入查找队列
ids.push_front(p.first);
cout << p.first << " ";
}
}
}
cout << endl;
//输出递归结果
for (auto& c : FindChildren(data, 1))
{
cout << c << " ";
}
cout << endl;
return 0;
}