数据结构实验之二叉树的建立与遍历
Time Limit: 1000MS Memory limit: 65536K
题目描述
已知一个按先序序列输入的字符序列,如abc,,de,g,,f,,,(其中逗号表示空节点)。请建立二叉树并按中序和后序方式遍历二叉树,最后求出叶子节点个数和二叉树深度。
输入
输入一个长度小于50个字符的字符串。
输出
输出共有4行:
第1行输出中序遍历序列;
第2行输出后序遍历序列;
第3行输出叶子节点个数;
第4行输出二叉树深度。
第1行输出中序遍历序列;
第2行输出后序遍历序列;
第3行输出叶子节点个数;
第4行输出二叉树深度。
示例输入
abc,,de,g,,f,,,
示例输出
cbegdfa
cgefdba
3
5
提示
首先由给出的先序序列构建二叉树,在进行中序查找和后序查找,二叉树深度及最大二叉树深度,可以由一个变量记录,不断和最大值作比较,最后得出最大值。
二叉树的叶子表示一个节点既没有左子树也没有右子树,遍历二叉树,查找符合要求的节点即可。
#include <iostream> #include <stdio.h> using namespace std; typedef struct jied { char date; struct jied *lchild,*rchild; } jied,*p; int d = 0,ma = 0,num = 0; void jianshu (p &T) { char ch; scanf("%c",&ch); if(ch == ',') T = NULL; else if(ch == '\n') { return ; } else { T = new jied; T -> date = ch; jianshu(T -> lchild); jianshu(T -> rchild); } } void zhongxu(p T) { if(T) { zhongxu(T -> lchild); printf("%c",T -> date); zhongxu(T -> rchild); } } void houxu(p T,int d) { if(T) { houxu(T -> lchild,d+1); houxu(T -> rchild,d+1); printf("%c",T -> date); if(ma<d) ma = d; } } void y(p T) { if(T!=NULL) { if(T -> lchild == NULL && T -> rchild == NULL) num++; else { y(T -> lchild); y(T -> rchild); } } } int main() { p T; jianshu(T); zhongxu(T); printf("\n"); houxu(T,ma); printf("\n"); y(T); printf("%d\n",num); printf("%d\n",ma + 1); return 0; }