zoukankan      html  css  js  c++  java
  • 【图论】【二叉树】以先序字符串方式建立二叉树

    问题 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

                                                                                        
                                                                                                                                    
  • 相关阅读:
    利用索引提高SQL Server数据处理的效率
    拆掉思维里的墙摘抄
    QR码和PDF417比较
    保存一个记录到数据库又马上返回ID号
    C#获取当前路径的7种方法
    汉诺塔算法不错,收藏了!
    如何确定Z检验的值(查正态分布表时要注意中间的数字都是面积,最左边一列和最上面一行都是Z值)
    opencv的安装
    SQL事务
    重大财务决策前的思考
  • 原文地址:https://www.cnblogs.com/LinqiongTaoist/p/7203742.html
Copyright © 2011-2022 走看看