九度1184解题报告

这是一个二叉树的问题,题目如下

http://ac.jobdu.com/problem.php?pid=1184

事实上考的就是二叉树的数据结构以及先序和中序遍历。一般来说,仅仅由先序遍历序列无法得到中序序列,然而,本题特殊的地方在于先序遍历序列中给出了遍历中遇到的空指针,这样就很容易根据序列构造二叉树:依次访问先序序列,遇到#就返回空指针,遇到非#字符就构造一个对应的节点,然后按照先左后右的顺序插入子树,子树由递归使用该算法得到,直到结束序列遍历。构造好二叉树后,输出中序遍历序列就很容易了。代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char s[101];
int size,x;

typedef struct Node 
{
    char c;
    struct Node *lchild;
    struct Node *rchild;    
}Node;

Node *insert()
{
     if (x>=size) return NULL;
     else
     {
         if (s[x]=='#')                                //在此处WA一次,因为题目说#代表空格,我以为输入真是空格呢,坑爹
         {
             ++x;                                      //若遇到#,则插入空树,遍历下一个元素 
             return NULL;
         }
         else
         {
             Node *ret=(Node*)malloc(sizeof(Node));    //若非#,则按先序遍历顺序插入元素 
             ret->c=s[x++];
             ret->lchild=insert();
             ret->rchild=insert();
             return ret;
         }
     }
}

void inorder(Node *t)                                  //中序遍历输出序列
{
    if (t==NULL) return;
    else
    {
        inorder(t->lchild);
        printf("%c ",t->c);
        inorder(t->rchild);
    } 
}

int main()
{
    while (gets(s))
    {
          size=strlen(s);
          x=0;
          Node *root=insert();
          inorder(root);
          printf("\n");
    }
    return 0;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值