hanyujianke 2020-04-17
已知一颗二叉树的中序遍历序列和后序遍历序列,求二叉树的深度。
输入数据有多组,输入T,代表有T组数据。每组数据包括两个长度小于50的字符串,第一个字符串表示二叉树的中序遍历,第二个表示二叉树的后序遍历。
输出二叉树的深度。
2 dbgeafc dgebfca lnixu linux
4 3
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct node { char data; struct node *left; struct node *right; }tree; char str1[100],str2[100]; tree *root,*link[54]; //str1为前序,str2为中序 求层序 tree *get_build(int len,char *str1,char *str2) { if(len==0) return NULL; int i; tree *root; root=(tree *)malloc(sizeof(tree)); root->data=str1[0]; for(i=0;i<len;i++) { if(str2[i]==root->data) break; } root->left=get_build(i,str1+1,str2); root->right=get_build(len-i-1,str1+i+1,str2+i+1); return root; } int high(tree *root)//求二叉树的高度 { int n,m; if(root==NULL) return 0; else { n=high(root->left); m=high(root->right); if(n>m) return n+1; else return m+1; } } void ans(tree *root)//层序遍历序列 { if (root) { int i=0,j=0; link[j++]=root; while(i<j) { if(link[i]) { link[j++]=link[i]->left; link[j++]=link[i]->right; printf("%c",link[i]->data); } i++; } } } void post(tree *root)//后序遍历序列 { if (root) { post(root->left); post(root->right); printf("%c",root->data); } } //str1中序遍历 ,str2后序遍历 求先序遍历 tree *creat(int len,char *str1,char *str2) { if(len==0) return NULL; int i; tree *root; root = (tree *)malloc(sizeof(tree)); root->data=str2[len-1]; //printf("%c",root->data); for(i=0; i<len; i++) { if(str1[i]==str2[len-1]) break; } root->left =creat(i,str1,str2); root->right = creat(len-i-1,str1+i+1,str2+i); return root; } int main() { int t,len; scanf("%d",&t); while(t--) { //memset(str1,0,sizeof(str1)); //memset(str2,0,sizeof(str2)); scanf("%s %s",str1,str2); len=strlen(str1); //root=get_build(t,str1,str2); //post(root); //printf("\n"); //ans(root); //printf("\n"); root=creat(len,str1,str2); printf("%d\n",high(root)); //printf("\n"); } return 0; }