您的位置:首页 > 理论基础 > 数据结构算法

数据结构实验之二叉树的建立与遍历

2013-06-28 20:53 344 查看

题目描述

已知一个按先序序列输入的字符序列,如abc,,de,g,,f,,,(其中逗号表示空节点)。请建立二叉树并按中序和后序方式遍历二叉树,最后求出叶子节点个数和二叉树深度。

输入

输入一个长度小于50个字符的字符串。

输出

输出共有4行:
第1行输出中序遍历序列;
第2行输出后序遍历序列;
第3行输出叶子节点个数;
第4行输出二叉树深度。

示例输入

abc,,de,g,,f,,,


示例输出

cbegdfa
cgefdba
3
5


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct tree
{
char  data;
struct tree *lchild;
struct tree *rchild;
};
struct tree *creat(struct tree *bt,int k)
{
struct tree *p;
char x;
p=(struct tree *)malloc(sizeof(struct tree));
scanf("%c",&x);
if(x!=',')
{
if(!(p=(struct tree *)malloc(sizeof(struct tree))))
exit(0);
p->data=x;
p->lchild=NULL;
p->rchild=NULL;
if(k==0)
bt=p;
if(k==1)
bt->lchild=p;
if(k==2)
bt->rchild=p;
creat(p,1);
creat(p,2);
}
return (bt);
}
int visit1(struct tree *bt)
{
if(bt!=NULL)
{
visit1(bt->lchild);
printf("%c",bt->data);
visit1(bt->rchild);
}
return 0;
}
int visit2(struct tree *bt)
{
if(bt!=NULL)
{
visit2(bt->lchild);
visit2(bt->rchild);
printf("%c",bt->data);
}
return 0;
}
int leaf (struct tree *bt)
{
if(!bt)
return 0;
else if(!bt->lchild&&!bt->rchild)
return 1;
else
return (leaf(bt->lchild)+leaf(bt->rchild));
}
int deep (struct tree *bt)
{
int d=0;
if(bt)
{
int lchilddeep=deep(bt->lchild);
int rchilddeep=deep(bt->rchild);
d=lchilddeep>=rchilddeep?lchilddeep+1:rchilddeep+1;
}
return d;
}

int main ()
{
struct tree *p;
p=(struct tree *)malloc(sizeof(struct tree));
p=creat(p,0);
visit1(p);
printf("\n");
visit2(p);
printf("\n");
printf("%d\n",leaf(p));
printf("%d\n",deep(p));
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: