这是一个二叉树的问题,题目如下
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;
}