#include #include #include void exit(int); #define MAX 100 typedef struct node { char d; struct node *lchild, *rchild; } Tnode; void MK(char in[], char is, char ie, char pre[], char pres, char pree, Tnode **r) { int i; if(is > ie || pres > pree) *r = NULL; else { *r = malloc(sizeof(Tnode)); (*r)->d = pre[pres]; for(i = is; i <= ie; i++) { if(in[i] == pre[pres]) { MK(in, is, i - 1, pre, pres + 1, pres + i - is, &(*r)->lchild); MK(in, i + 1, ie, pre, pres + i - is + 1, pree, &(*r)->rchild); break; } if(i > ie) { printf("输入错误!\n"); exit(1); } } } } void postorder(Tnode *r) { if(r) { postorder(r->lchild); postorder(r->rchild); printf("%c", r->d); } } int leaf(Tnode *r) { if(r == NULL) return 0; else if(r->lchild == NULL && r->rchild == NULL) return 1; else return leaf(r->lchild) + leaf(r->rchild); } int height(Tnode *r) { int h1, h2; if(r == NULL) return 0; else { h1 = height(r->lchild); h2 = height(r->rchild); return 1 + (h1 > h2 ? h1 : h2); } } void main() { Tnode *r = NULL; char in[MAX], pre[MAX]; printf("请输入前序序列:\n"); gets(pre); printf("请输入中序序列:\n"); gets(in); MK(in, 0, strlen(in) - 1, pre, 0, strlen(pre) - 1, &r); printf("\n后序遍历序列为:\n"); postorder(r); printf("\n叶结点的个数为:%d\n", leaf(r)); printf("\n高度为:%d\n", height(r)); }