求二叉树的先序遍历
Time Limit: 1000MS Memory limit: 65536K
题目描述
已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历
输入
输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据。每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的中序遍历序列,第二个字符串表示二叉树的后序遍历序列。
输出
输出二叉树的先序遍历序列
示例输入
2 dbgeafc dgebfca lnixu linux
示例输出
abdegcf xnliu
下面是通俗的求法就是先建树。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <malloc.h> struct node { char data; struct node *l,*r; }; struct node *creat(struct node *root,char *s,char *s1,int n) { if(n<=0) return NULL; root=(struct node*)malloc(sizeof(struct node)); root->data=s1[n-1]; int p=strchr(s,s1[n-1])-s; root->l=creat(root->l,s,s1,p); root->r=creat(root->r,s+p+1,s1+p,n-p-1); return root; }; void xianxu(struct node *p) { if (p) { printf("%c",p->data); xianxu(p->l); xianxu(p->r); } } int main() { int len,n; char str1[100],str2[100]; scanf("%d",&n); while(n--) { struct node *head; head = (struct node *)malloc(sizeof(struct node )); scanf("%s %s",str1,str2); len = strlen(str2); head = creat(head,str1,str2,len); xianxu(head); printf("\n"); } return 0; }
还有一个非主流的求法:
自己理解吧
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <malloc.h> struct node { char data; struct node *l,*r; }; char s[100]; int t=0; struct node *creat(int len,char *str1,char *str2) { int k; if(len<=0) return NULL; struct node *head; head = (struct node *)malloc(sizeof(struct node)); head->data = *str1; char *p; for(p = str2;p!=NULL;p++) if(*p==*str1) break; k = p-str2; head->l = creat(k,str1+1,str2); head->r = creat(len-k-1,str1+k+1,p+1); return head; } void houxu(struct node *p) { if (p) { houxu(p->l); houxu(p->r); s[t++] = p->data; } } int main() { int i,len,n; char str1[100],str2[100],str3[100],str4[100]; scanf("%d",&n); while(n--) { struct node *head; head = (struct node *)malloc(sizeof(struct node )); scanf("%s %s",str1,str2); len = strlen(str2); for(i=0;i<len;i++) { str3[i] = str2[len-1-i]; str4[i] = str1[len-1-i]; } head = creat(len,str3,str4); t = 0; houxu(head); for(i=len-1;i>=0;i--) printf("%c",s[i]); printf("\n"); } return 0; }