http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2137&cid=1145
View Code
1 #include<stdio.h> 2 #include<string.h> 3 #include<malloc.h> 4 typedef struct tree 5 { 6 char data ; 7 struct tree *l, *r ; 8 }tree ; 9 tree *creat(char *root, char *in, int k ) 10 { 11 tree *t ; 12 char *p ; 13 int m ; 14 if(k<=0) 15 return NULL ; 16 t = (tree*)malloc(sizeof(tree)) ; 17 t->data = *root ; 18 for(p = in; p!=NULL; p++) 19 if(*p == *root) break ; 20 m = p - in ; 21 t->l = creat(root+1, in, m) ; 22 t->r = creat(root+m+1,p+1,k-m-1) ; 23 return t ; 24 } 25 void lastsearch(tree *t) 26 { 27 if(t!=NULL) 28 { 29 lastsearch(t->l) ; 30 lastsearch(t->r) ; 31 printf("%c", t->data) ; 32 } 33 } 34 void cengci(tree *t) 35 { 36 int rear = 1, front = 0 ; 37 tree *p[100] ; 38 p[0] = t ; 39 while(rear>front) 40 { 41 if(p[front]) 42 { 43 printf("%c",p[front]->data) ; 44 p[rear++] = p[front]->l ; 45 p[rear++] = p[front]->r ; 46 front++ ; 47 } 48 else 49 front++ ; 50 } 51 } 52 int main() 53 { 54 tree *t ; 55 int k, n ; 56 char root[100], in[100] ; 57 scanf("%d", &n) ; 58 while(n--) 59 { 60 scanf("%s%s", root, in) ; 61 k = strlen(root) ; 62 t = creat(root, in, k ) ; 63 lastsearch(t) ; 64 puts("") ; 65 cengci(t) ; 66 puts("") ; 67 } 68 return 0; 69 }
已知先序和中序序列,求后序序列
从先序遍历中读入根节点;然后从中序遍历中找到与根节点相等的元素,将中序序列分成两个部分,左边的为二叉树的左子树,右边为二叉树的右子树;最后递归调用得到根节点的左右子树