Problem Description
已知一个按先序序列输入的字符序列,如abc,,de,g,,f,,,(其中逗号表示空节点)。请建立二叉树并按中序和后序方式遍历二叉树,最后求出叶子节点个数和二叉树深度。
Input
输入一个长度小于50个字符的字符串。
Output
输出共有4行:
第1行输出中序遍历序列;
第2行输出后序遍历序列;
第3行输出叶子节点个数;
第4行输出二叉树深度。
Sample Input
abc,,de,g,,f,,,
Sample Output
cbegdfa cgefdba 3 5
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
char data;
struct node *lc;
struct node *rc;
};
int num;
struct node *root;
struct node *creat(struct node *root)
{
char ch;
scanf("%c",&ch);
if(ch==',') root=NULL;
else
{
root=(struct node *)malloc(sizeof(struct node));
root->data=ch;
root->lc=creat(root->lc);
root->rc=creat(root->rc);
}
return root;
}//建树过程
void middle(struct node *root)
{
if(root!=NULL)
{
middle(root->lc);
printf("%c",root->data);
middle(root->rc);
}
}//中序遍历
void last(struct node *root)
{
if(root!=NULL)
{
last(root->lc);
last(root->rc);
printf("%c",root->data);
}
}//后序遍历
int deep(struct node *root)
{
int ld=0,rd=0;
if(root==NULL) return 0;
ld=deep(root->lc);
rd=deep(root->rc);
if(ld>rd) return (ld+1);
else return (rd+1);
}//计算树的深度
void count(struct node *root)
{
if(root!=NULL)
{
if(root->lc==NULL&&root->rc==NULL) num++;
count(root->lc);
count(root->rc);
}
}//计算叶子结点的个数
int main()
{
num=0;
root=creat(root);//建树过程要在最开始设置一个结构体(根),开始建树
middle(root);//中序遍历
printf("\n");//换行
last(root);//后序遍历
printf("\n");//换行
count(root);//计算叶子结点
printf("%d\n",num);//输出叶子结点个数
printf("%d\n",deep(root));//输出树的深度
return 0;
}