数据结构实验之二叉树的建立与遍历
二叉树的基本操作 , 中序遍历,后序遍历,前序遍历,只是根节点输出的位置不同,
叶子结点,深度,需要自己理解,也非常的简单
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
Hint
Source
ma6174
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int l ;
char s[51];
struct node
{
char data;
struct node *left , *right;
};
struct node *creat()
{
char c = s[l++];
struct node *root;
if (c == ',')
{
return NULL;
}
else
{
root = (struct node *)malloc(sizeof (struct node ));
root ->data = c;
root ->left = creat();
root ->right = creat();
}
return root;
};
void midd(struct node *root)//中序遍历
{
if (root)
{
midd(root ->left);//主要的区别就是这三行的顺序问题1
printf("%c" , root->data);//1
midd(root ->right);//1
}
}
void hou(struct node *root)//后序遍历
{
if (root)
{
hou(root ->left);//1
hou(root ->right);//1
printf("%c" , root ->data);//1
}
}
int leave(struct node *root)//叶子算法
{
if (root == NULL)
{
return 0;
}
else if (root ->left == NULL && root ->right == NULL)
{
return 1;
}
else
{
return leave(root ->left) + leave(root ->right);
}
}
int deth(struct node *root)//树的深度
{
if (root == NULL)
{
return 0;
}
else
{
int maxleft = deth(root ->left) , maxright = deth(root ->right);
if (maxleft > maxright)
{
return 1 + maxleft;
}
else
{
return 1 + maxright;
}
}
}
int main()
{
struct node *root;
while(~scanf("%s" , s))
{
l = 0;
root = (struct node *)malloc(sizeof (struct node ));
root = creat();
midd(root);
printf("\n");
hou(root);
printf("\n");
int k ;
k = leave(root);
printf("%d\n" , k);
k = deth(root);
printf("%d\n", k);
}
return 0;
}
/***************************************************
User name: jk170717
Result: Accepted
Take time: 0ms
Take Memory: 152KB
Submit time: 2018-08-07 15:47:15
****************************************************/