社区讨论

求救大佬,用multimap怎么写树,万分感谢

学术版参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mhjty2k8
此快照首次捕获于
2025/11/04 08:27
4 个月前
此快照最后确认于
2025/11/04 08:27
4 个月前
查看原帖
各位大佬,蒟蒻最近上了multimap,结果突发奇想,要用multimap写树

问题描述

给出一个二叉树,求二叉树的先序遍历(用multimap)。

输入描述

  • 第一行输入一个正整数n,表示节点个数
  • 接下来n行,每行三个整数,id,l,r,分别表示当前节点的编号,左孩子编号,右孩子编号

输出格式

  • 一行,表示二叉树的先序遍历
我的思路
先用multimap保存树(multimap<int,pair<string,int>>mp)
用键值存放节点,因为二叉树分左子树和右子树,所以加了一个string,用来判断左右子树。 用一个find函数来查找节点位置。
救救本蒟蒻吧,本人调了1天的代码了,全爆编译了
CPP
#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
multimap<int,pair<string,int>>mp;
auto find(multimap<int,pair<string,int>>::iterator start,int x){
	auto it=start;
	for(;it!=mp.end();it++){
		if(it->second==x){
			return it->second;
		}
	}
}
void dfs(int deep){
	pair<string,int> t1=find(mp.begin(),deep);
	if(t1->second!=0)
		cout<<t1->second<<endl;
	pair<string,int>t_lchild=find(mp.begin(),deep);
	pair<string,int>t_rchild=find(mp.begin()+t_lchild->second,deep);
	dfs(t_lchild->second);
	dfs(t_rchild->second);
}
int main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	//ios::sync_with_stdio(false);
	//cin.tie(0);
	int n;
	cin>>n;
	int l,r;
	for(int i=1;i<=n;i++){
		int id,l,r;
		scanf("%d%d%d",&id,&l,&r);
		mp.insert(make_pair(id,make_pair("l",l)));
		mp.insert(make_pair(id,make_pair("r",r)));
	}
	dfs(1);
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...