ZZULI  1210  二叉树(3)

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

二叉树(3)

Time Limit:1000MS  MemoryLimit:65536K
Total Submit:24 Accepted:6

Description

按扩展的先序序列(即包括空结点,1表示空结点)输入二叉树的各结点。

ZZULI <wbr> <wbr>1210 <wbr> <wbr>二叉树(3)

你要完成的任务有三个
(1)建立二叉树
(2)按中序序列线索化二叉树
(3)输入一个结点元素值,输出它的前驱和后继。
(若该元素的前驱或后继为空,请用1代替)

Input

输入有1组数据。
数据的第一行为 :按扩展的先序序列输入二叉树的各结点。
数据的第二行为 一个整数n(0《n《20)。
接下来的n行,每行输入一个结点的名称。

Output

输出结果有n行,每行是对应输入结点的结果。

SampleInput

ABD111CE11F113AED

SampleOutput

B EA C1 B

Source

李老师

其实只要会建立二叉树,剩下的两题都不算太难,只是不明白为什么后两题的通过量那么低ZZULI <wbr> <wbr>1210 <wbr> <wbr>二叉树(3)

这个题我想好多人都不明白线索化二叉树为何物,其实我当初也不明白,以为是很深奥的东西呢,后来百度了之后才发现其实他和先序遍历、中序遍历与后序遍历是一样的,着实让我纳闷了半天,既然一样为什么还起个那么深奥的名字,坑爹啊!ZZULI <wbr> <wbr>1210 <wbr> <wbr>二叉树(3)

这里附带线索化二叉树的链接,大家可以看下:

http://hi.baidu.com/lewutian/blog/item/3d55abf3863d665b342acc78.html

代码如下:

#include<stdio.h>
#include<stdlib.h>
char str[1001];
int flag[1001];
int top,max;
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 look(Lnode p)
{
   if(p->data=='1')
      return;
   look(p->left);
   str[top++]=p->data;
   look(p->right);
}
int main()
{
    Lnoderoot;
    inti,n;
    chars;
   gets(str);
    top=0;
   root=newnode();
   build(root);
    top=0;
   look(root);
   scanf("%d",&n);
   while(n--)
    {
      getchar();
      scanf("%c",&s);
      for(i=0;i<top;i++)
         if(str[i]==s)
          {
            if(i==0)
               printf("1");
             elseprintf("%c",str[i-1]);
            if(i==top-1)
                printf("1\n");
             elseprintf(" %c\n",str[i+1]);
             break;
          }
    }
    return0;
}