问题 I(1186): 【基础算法】以先序字符串方式建立二叉树
时间限制: 1 Sec 内存限制: 64 MB题目描述
输入一个二叉树的先序串,输出其后序遍历结果。如果结点的子树为空,先序串的对应位置为空格符。
输入
第1行:先序串(结点数≤26,以单个大写字母表示)
输出
第1行:后序序列
样例输入
Copy (如果复制到控制台无换行,可以先粘贴到文本编辑器,再复制)
AB C D
样例输出
CBDA
提示
#------------------------------------------------------------------------------#
乍一看,貌似与以括号形式输出二叉树差不多,事实上,差得挺多……
括号输出是不需要建树的,而这道题
现在(注意这里)
是需要建树的,于是我们便开始建树。
把代码变成一段一段的显然不是我的风格,所以先讲思路。
首先肯定要存当前节点的左儿子和右儿子(结构体)。
输入字符串后,开始递归,如果当前节点没有左儿子,就把这个字符放到左儿子里,反之,再右儿子里,然后,只要当前字符不为空格,就继续递归。
这里要牵扯到字母,用一般的数组下标很麻烦,于是我又借此装了个逼——map数组上场
如果知道map的朋友可以跳过此处,这里大概讲讲map:
map其实是一种映射(不要问我映射是什么,我反正直接理解为储存),它的下标可以为任何变量——字符类,字符串(string)类,普通的数字,甚至结构体都行,它储存(我不说映射了)的内容也可以是任何变量。
就这样。
头文件:
#include
using namespace std;
声明方式:
map <下标,储存类型> 数组名;
如:
map a;
这样的话就可以这样用:
string x[10];
for(...)
{
cin>>x[i];
map[x[i]]=1;
}
就是这样了,关于map还有很多类似于find之类的函数很好用,以后再说吧
好了,建树就说完了,后序就不想说了,当然注意的是空格不要输出。
代码:
#include
当然,有100多b的方法
其实,是不需要建树的,只用一个变量加递归就可以完成此题
超简单的方法:
读入一个字符,只要不是空格就再次递归,最后输出即可,因为一旦有了空格就代表当前结点的某一儿子为空,二叉树有两个儿子,所以递归两次便可以把左子树和右子树找完。
代码:
#include
void h()
{
char c=getchar();//getchar一个一个处理
if(c==' ')//是空格代表一个儿子没有了
return;
h();//找左子树
h();//找右子树(此时已经遇到了一个空格,才会返回,进行这一步,说明左子树找完了)
printf("%c",c);//打印
}
int main()
{
h();
}
By WZY