ZZULI 1208  二叉树(1)

来源:互联网 发布:微博域名怎么改 编辑:程序博客网 时间:2024/04/29 17:15

二叉树(1)

Time Limit:1000MS  MemoryLimit:65536K
Total Submit:189 Accepted:77

Description

1、按扩展的先序序列(即包括空结点)输入二叉树的各结点,建立二叉树,并输出其先序、中序和后序遍历序列。

ZZULI <wbr>1208 <wbr> <wbr>二叉树(1)

如图所示的二叉树的扩展的先序序列为:ABD111C E11F11(1代表空结点)

Input

输入有多组例子,每组数组占一行;

Output

输出对应的结果,每组结果占三行。

SampleInput

ABD111CE11F11

SampleOutput

ABDCEFDBAECFDBEFCA

Source

李老师

二叉树经典题目,扩展的先序遍历有个特征,就是没遇到空节点时可以从数组中看出来,这样遇到空节点时就可以判定该节点已经走到最后一步了,因此退出该节点,返回上一层(即build()中的return;),这样依次建立左节点,右节点……

先序遍历、中序遍历和后序遍历就不用说了,这个是经典中的经典,百度一下,遍地都是写的比我好的代码。

代码如下:

#include<stdio.h>
#include<stdlib.h>
char str[1001];
int top;
typedef struct tree{
    chardata;
    struct tree*left,*right;
}node,*Lnode;
int m=sizeof(node);
Lnode newnode()
{
    Lnodep;
   p=(Lnode)malloc(m);
   p->left=NULL;
   p->right=NULL;
    returnp;
}
void build(Lnode p)
{
    Lnodes,q;
   if(str[top]=='1'||str[top]==0){
      p->data='1';
      return;
    }
    else {
      p->data=str[top];
      s=newnode();
      p->left=s;
       top++;
      build(s);
    }
   q=newnode();
   p->right=q;
    top++;
   build(q);
}
void pre(Lnode p)
{
   if(p==NULL)return;
   if(p->data!='1')
   printf("%c",p->data);
   pre(p->left);
   pre(p->right);
}
void mid(Lnode p)
{
   if(p==NULL)return;
   mid(p->left);
   if(p->data!='1')
   printf("%c",p->data);
   mid(p->right);
}
void aft(Lnode p)
{
   if(p==NULL)return;
   aft(p->left);
   aft(p->right);
   if(p->data!='1')
   printf("%c",p->data);
}
int main()
{
    Lnoderoot;
   while(gets(str))
    {
       top=0;
      root=newnode();
      build(root);
      pre(root);
      printf("\n");
      mid(root);
      printf("\n");
      aft(root);
      printf("\n");
    }
    return0;
}

原创粉丝点击