以先序字符串方式建立二叉树

原题

题目描述

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

输入

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

输出

第1行:后序序列

样例输入

AB#C##D##

样例输出

CBDA

注:空格用#表示

分析

这道题不能像上一道题那么蹊跷来做了。
首先建树,详情见题中注释。

char a[105];
int len,i;//i逐渐增加
void build(int s){
    if(i==len) return;//已经建完树了
    char c=a[i];//当前的字符
    i++;
    if(!tree[s].l) tree[s].l=c;//如果树的左边是空的,就给左边赋值
    else tree[s].r=c;//反之
    if(c!=' ') build(c);
    if(c!=' ') build(c);//再来递归两下
}

因为本题的重点就是建树,遍历什么的前面都讲过了,建完树以后就开心的遍历啦~~~

就为了写出这个建树程序,我脑花都散了,好了,源程序如下
╭~~~╮
(o@.@o)

源代码

#include
#include
struct node{int l,r;};
node tree[105];
char a[105];
int len,i;
void build(int s){
    if(i==len) return;
    char c=a[i];
    i++;
    if(!tree[s].l) tree[s].l=c;
    else tree[s].r=c;
    if(c!=' ') build(c);
    if(c!=' ') build(c);
}
void last(int g){
    if(g){
        last(tree[g].l);
        last(tree[g].r);
        if(g!=' ') printf("%c",g);
    }
}
int main()
{
    gets(a);
    len=strlen(a);
    build(0);
    last(a[0]);
}

你可能感兴趣的:(#,C++,#,School,OJ,#,二叉树,#,遍历,#,图论)