【图论】【二叉树】以先序字符串方式建立二叉树

问题 I(1186): 【基础算法】以先序字符串方式建立二叉树

时间限制: 1 Sec  内存限制: 64 MB

题目描述

输入一个二叉树的先序串,输出其后序遍历结果。如果结点的子树为空,先序串的对应位置为空格符。

输入

第1行:先序串(结点数≤26,以单个大写字母表示)

输出

第1行:后序序列

样例输入

 (如果复制到控制台无换行,可以先粘贴到文本编辑器,再复制)

AB C  D  

样例输出

CBDA

提示


#------------------------------------------------------------------------------#
乍一看,貌似与以括号形式输出二叉树差不多,事实上,差得挺多……

括号输出是不需要建树的,而这道题现在(注意这里)是需要建树的,于是我们便开始建树。
把代码变成一段一段的显然不是我的风格,所以先讲思路。
首先肯定要存当前节点的左儿子和右儿子(结构体)。
输入字符串后,开始递归,如果当前节点没有左儿子,就把这个字符放到左儿子里,反之,再右儿子里,然后,只要当前字符不为空格,就继续递归。

这里要牵扯到字母,用一般的数组下标很麻烦,于是我又借此装了个逼——map数组上场
如果知道map的朋友可以跳过此处,这里大概讲讲map:
map其实是一种映射(不要问我映射是什么,我反正直接理解为储存),它的下标可以为任何变量——字符类,字符串(string)类,普通的数字,甚至结构体都行,它储存(我不说映射了)的内容也可以是任何变量。
就这样。
头文件:
#include<map>
using namespace std;
声明方式:
map <下标,储存类型> 数组名;

如:
map <string,int> a;
这样的话就可以这样用:
string x[10];
for(...)
{
cin>>x[i];
map[x[i]]=1;
}

就是这样了,关于map还有很多类似于find之类的函数很好用,以后再说吧

好了,建树就说完了,后序就不想说了,当然注意的是空格不要输出。

代码:
#include<map>
#include<cstdio>
#include<cstring>
using namespace std;
struct node
{
    char l,r;
};
map <char,node> tree;//定义一个下标为char,存储类型为node(结构体)的map数组
char a[300];
int len,x;
void f(char s)
{
    if(x==len) return;//如果长度到了return
    char c=a[x++];//当前字符存入(其实不存也行)
    if(!tree[s].l) tree[s].l=c;//左儿子
    else tree[s].r=c;//右儿子
    if(c!=' ') f(c);//递归找完左子树
    if(c!=' ') f(c);//右子树
}
void last(char g){//倒序输出这个很容易不讲了
    if(g)
    {
        last(tree[g].l);
        last(tree[g].r);
        if(g!=' ')
            printf("%c",g);
    }
}
int main()
{
    fgets(a,300,stdin);//读入
    len=strlen(a);
    f(0);
    last(a[0]);
}
当然,有100多b的方法


其实,是不需要建树的,只用一个变量加递归就可以完成此题
超简单的方法:
读入一个字符,只要不是空格就再次递归,最后输出即可,因为一旦有了空格就代表当前结点的某一儿子为空,二叉树有两个儿子,所以递归两次便可以把左子树和右子树找完。

代码:
#include<cstdio>
void h()
{
	char c=getchar();//getchar一个一个处理
	if(c==' ')//是空格代表一个儿子没有了
		return;
	h();//找左子树
	h();//找右子树(此时已经遇到了一个空格,才会返回,进行这一步,说明左子树找完了)
	printf("%c",c);//打印
}
int main()
{
	h();
}

                                                                                                                                                                 By WZY

                                                                                    
                                                                                                                                
原文地址:https://www.cnblogs.com/LinqiongTaoist/p/7203742.html