C - 二叉树的输入

Description

用二叉树的带虚结点表示的前序遍历序可以唯一的确定一棵二叉树。

Input

输入包含多组数据。
每行是一棵二叉树的带虚结点(#)表示的前序遍历序串,长度不超过2000。每个结点为一个字符。

Output

对每行输入,输出对应二叉树的中序遍历序(不含虚结点)、后序遍历序(不含虚结点)和层次遍历序(不含虚结点)。
每棵二叉树的输出占一行,中序遍历序、后序遍历序和层次遍历序之间用一个空格隔开。

Sample Input
ab##c##

ab###

Sample Output
bac bca abc

ba ba ab

代码:

/*
需要注意的是
输入 字符串的时候,不能用 scanf 或者是 gets 输入,只能用 cin 输入
原因是:
cin不接受空格,TAB,换行符 等键的输入,遇到这些键,字符串会终止
而gets()则接受连续的输入,包括空格,TAB
在每一行的最后有个换行符
*/
/* 这样输入的原因是 单独去判断第二组样例
*/
----------
#include<stdio.h>
#include<string.h>
#include<cstring>
#include<stdlib.h>
#include<iostream>
#include<queue>
using namespace std;
char c;
typedef struct BiTNode
{
    char data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree &T,int flag)
{
    if(flag)//每一组时,当 flag 不是 1 的时候,允许输入下一个字符
        cin>>c;
    else
        flag=1;//输入第一个字符的时候,flag是0,然后就变成1 ,去输入下一个字符
    if(c=='\n')
        return ;
    else{
        if(c=='#')
            T=NULL;
        else{
            T=(BiTree)malloc(sizeof(BiTNode));
            T->data=c;
            CreateBiTree(T->lchild,flag);
            CreateBiTree(T->rchild,flag);
        }
    }
}
void Visit(BiTree T)
{
    if(T->data!='#')
        printf("%c",T->data);
}
void Inorder(BiTree T)
{
    if(T!=NULL)
    {
        Inorder(T->lchild);
        Visit(T);
        Inorder(T->rchild);

    }
}
void Postorder(BiTree T)
{
    if(T!=NULL)
    {
        Postorder(T->lchild);
        Postorder(T->rchild);
        Visit(T);
    }
}
void Levelorder(BiTree T)//层次遍历
{
    BiTree p=T;
    queue<BiTree> q;
    q.push(p);
    while(!q.empty())
    {
        p=q.front();
        printf("%c",p->data);
        q.pop();
        if(p->lchild!=NULL)
            q.push(p->lchild);
        if(p->rchild!=NULL)
            q.push(p->rchild);
    }
}
int main()
{
    while(cin>>c)
    {
        int flag=0;
        BiTree T;
        if(c=='#')//特别考虑样例二的情况
            cout<<endl;
        else{
            flag=0;
            CreateBiTree(T,flag);
            Inorder(T);
            printf(" ");
            Postorder(T);
            printf(" ");
            Levelorder(T);
            cout<<endl;
        }
        getchar();//用来取每一行最后输出是的换行符
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值