原题链接:https://www.luogu.org/problem/P1305
题目描述
输入一串二叉树,用遍历前序打出。
输入输出格式
输入格式:
第一行为二叉树的节点数n。(n ≤ 26)
后面n行,每一个字母为节点,后两个字母分别为其左右儿子。
空节点用*表示
输出格式:
前序排列的二叉树
输入输出样例
输入样例#1:
6
abc
bdi
cj*
d**
i**
j**
输出样例#1:
abdicj
说明
时空限制:1000ms 125M
思路:一道二叉树的题目,也可以用搜索来做。
第一种:二叉树
- 这道题的数据有点水,第一个字符串的第一个点是整棵树的根节点,所以只需要在第一个字符串进行操作就好。
- 遍历接下来的n-1个字符串,找出每一串根节点在第一串的位置,删掉第一串的该节点,然后再把每一个字符串插入到该位置。
- 最后遍历一系列操作后的第一个字符串,如果是空字符则跳过,否则输出字符。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main(){
int n;
cin>>n; //n个节点
string str;
cin>>str; //第一个字符串
for(int i=1;i<n;i++){ //遍历后面n-1个字符串
string s;
cin>>s;
int pos=str.find(s[0]); //在第一个字符串找到该字符串的根节点位置
str.erase(pos,1); //删掉第一个字符串该位置字符
str.insert(pos,s); //从该位置插入输入的此字符串
}
for(int i=0;i<str.size();i++){ //遍历一系列操作后的第一个字符串
if(str[i]=='*') //如果是空字符,跳过
continue;
else //否则输出字符
cout<<str[i];
}
cout<<endl;
return 0;
}
第二种:搜索
因为数据比较水,第一个字符串根节点是整棵树的根节点,所以从该根节点一直搜索下去,每次都输出根节点即可。
代码如下:
#include <iostream>
#include <cstdio>
using namespace std;
int n;
char a[30][3];
void f(char x)
{
if(x!='*')
{
cout<<x;
for(int i=0;i<n;i++)
if(a[i][0]==x)
{
f(a[i][1]);
f(a[i][2]);
}
}
return;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i][0]>>a[i][1]>>a[i][2];
f(a[0][0]);
return 0;
}