二叉树(1)
Time Limit:1000MS
Total Submit:193 Accepted:80
Description
1、按扩展的先序序列(即包括空结点)输入二叉树的各结点,建立二叉树,并输出其先序、中序和后序遍历序列。
![zzuli <wbr>1208二叉树(一) zzuli <wbr>1208二叉树(一)](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
如图所示的二叉树的扩展的先序序列为:ABD111C E11F11(1代表空结点)
Input
输入有多组例子,每组数组占一行;
Output
输出对应的结果,每组结果占三行。
Sample Input
ABD111CE11F11
Sample Output
ABDCEF DBAECF DBEFCA
# include<stdio.h>
# include<stdlib.h>
char str[1001];
int top;
typedef struct tree{
char data;
struct tree *left,*right;
}Lnode,*list;
int m=sizeof(Lnode);
list newnode()//为结点申请地址
{
list p;
p=(list)malloc(m);
p->left=NULL;
p->right=NULL;
return p;
}
void Creatree(list p)//建立二叉树
{
list q,s;
if(str[top]=='1'||str[top]==0)//如果是空节点或时字符串尾
{
p->data='1';
return ; 返回空(即NULL);
}
else
{
p->data=str[top];
s=newnode();//为左子结点申请地址
p->left=s;//赋给父结点
top++;
Creatree(s);
}
q=newnode();//为右子结点申请地址
p->right=q;//赋给父结点
top++;
Creatree(q);
}
void pre(list p)//先序遍历(先根结点,左节点,右结点)
{
if(p==NULL)//结点不存在
return ;
if(p->data!='1')//输出根节点的数据
printf("%c",p->data);
pre(p->left);//递归遍历所有左结点
pre(p->right);//递归遍历所有右结点
}
void mid(list p)//中序遍历 (先左节点,根结点,右结点)
{
if(p==NULL)
return ;
mid(p->left);//递归遍历所有左结点
if(p->data!='1')//到达叶子节点后,访问根结点
printf("%c",p->data);
mid(p->right);//再访问右结点
}
void cur(list p)
{
if(p==NULL)
return ;
cur(p->left);//遍历至叶子的左孩子,与空节点后返回,再遍历叶子的右孩子
cur(p->right);
if(p->data!='1')
printf("%c",p->data);
}
int main()
{
list root;
while(gets(str))
{
top=0;
root=newnode();
Creatree(root);
pre(root);
printf("\n");
mid(root);
printf("\n");
cur(root);
printf("\n");
}
return 0;
}
注:代码是高人写的,注释是我按自己的理解写的,各位路人如有发现错误,敬请斧正!!