题目描述
已知一个按先序序列输入的字符序列,如abc,,de,g,,f,,,(其中逗号表示空节点)。请建立二叉树并按中序和后序方式遍历二叉树,最后求出叶子节点个数和二叉树深度。
输入
输入一个长度小于50个字符的字符串。
输出
输出共有4行:
第1行输出中序遍历序列;
第2行输出后序遍历序列;
第3行输出叶子节点个数;
第4行输出二叉树深度。
第1行输出中序遍历序列;
第2行输出后序遍历序列;
第3行输出叶子节点个数;
第4行输出二叉树深度。
示例输入
abc,,de,g,,f,,,
示例输出
cbegdfa
cgefdba
3
5
顺序存储,叶子==左右子树都为空;
源代码C++下可行
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> typedef char ET; char str[100]; int i,n,count=0;
/*定义数*/ typedef struct BiTNode { ET data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; /*建树*/ int CreatrBiTree(BiTree &T) { if(i<n) { if(str[i++]==',') T=NULL; else { T=(BiTNode*)malloc(sizeof(BiTNode)); if(!T)exit(-1); T->data=str[i-1]; CreatrBiTree(T->lchild); CreatrBiTree(T->rchild); } } return 1; }/*中序输出*/ void InOrder(BiTree &T) { if(T) { InOrder(T->lchild); printf("%c",T->data); InOrder(T->rchild); } }/*后续输出*/ void PostOrder(BiTree &T) { if(T) { PostOrder(T->lchild); PostOrder(T->rchild); printf("%c",T->data); } }/*叶子*/ void LeafCount(BiTree &T) { if(T) { if((!T->lchild)&&(!T->rchild)) { count++; } LeafCount(T->lchild); LeafCount(T->rchild); } }/*深度*/ int DepthBiTree(BiTree T) { int HL,HR; if(!T)return 0; else { HL=DepthBiTree(T->lchild); HR=DepthBiTree(T->rchild); if(HL>HR) return HL+1; else return HR+1; } } int main() { BiTree T; i=0; scanf("%s",str); n=strlen(str); CreatrBiTree(T); InOrder(T); printf("\n"); PostOrder(T); printf("\n"); LeafCount(T); printf("%d\n",count); printf("%d\n", DepthBiTree(T)); }