题解 P1305 【新二叉树】

kradcigam

2019-07-18 16:31:40

Solution

好像没有人搞 map 反映。 # map 使用 map 是一个特别好的东西,有很大的用处。 > map 第一个好处是作为一个数组,可以开很大! - 值域范围特别大: ```cpp map<int,int>a; ``` 你可以把 $a$ 数组当成普通数组用,不过要注意一点: > map 是 STL,所以当你定义了一个后,就不能像普通数组一样使用一些的数组函数,比如 memset。 > - 你就不能写 > ```cpp > memset(a,0,sizeof(a)); > ``` > - 取而代之的是 STL 的函数 > ```cpp > a.clear(); > ``` > map 第二个好处是可以实现下标类型不一定为 int 的数组。 - 类型不一定为 int map<下标类型,数值类型> - 比如 ```cpp map<string,char>a; string st="123"; a[st]='1'; ``` ## 补充说明 map 不仅可以开一维数组,还可以开二维数组。 - 比如: ```cpp map<int,map<int,int> /*注意这里是一定要有空格的,否则在没有c++11的情况下会编译错误*/>; ``` # 回归本题 有了这些知识储备,我们可以更轻松地来做这道题,首先,题目中看到了遍历,我们就要先存储图。 ```cpp void find(char ch){ cout<<ch; if(x[ch]!='*')find(x[ch]); if(y[ch]!='*')find(y[ch]); } ``` 这里,我用了 map,`x[ch]` 表示了 `ch` 的左儿子,`y[ch]` 表示了 `ch` 的右儿子。 是不是很方便? map 是个好东西! 有了 map,有了程序的框架,代码也自然浮出了水面。 ```cpp #include <bits/stdc++.h>//以万能头文件开始了整个代码 using namespace std; map<char,char>x;//用map来记录一个节点的左儿子 map<char,char>y;//用map来记录一个节点的右儿子 char a[35];//节点 void find(char ch){//并查集 cout<<ch; if(x[ch]!='*')find(x[ch]); if(y[ch]!='*')find(y[ch]); } int main(){ int n; cin>>n; for(int i=1;i<=n;i++){ char left,right; cin>>a[i]>>left>>right; x[a[i]]=left; y[a[i]]=right; }find(a[1]);//开始遍历整棵树 return 0;//结束程序 } ```