一定注意for加分号
Description
已知一颗二叉树的中序遍历序列和后序遍历序列,求二叉树的深度。
Input
输入数据有多组,输入T,代表有T组数据。每组数据包括两个长度小于50的字符串,第一个字符串表示二叉树的中序遍历,第二个表示二叉树的后序遍历。
Output
输出二叉树的深度。
Sample
Input
2
dbgeafc
dgebfca
lnixu
linux
Output
4
3
#include <stdio.h>//15.50-16.10
#include<stdlib.h>
#define MAXSIZE 55
typedef struct a{
char data;
struct a *lchild;
struct a *rchild;
}TNode;
char c[MAXSIZE];
char d[MAXSIZE];
int i=0;//i用来创建树 遍历用
TNode* create(){
if(c[i]==',')
{i++;
return NULL;
}
if(c[i]=='\0')
return NULL;
else {
TNode *T=(TNode*)malloc(sizeof(TNode));
T->data=c[i++];
T->lchild=create();
T->rchild=create();
return T;
}
}
TNode *create1(int l1,int r1,int l2,int r2)
{
TNode *root=(TNode*)malloc(sizeof(TNode));
root->data=d[r2];int i;
for(i=l1;c[i]!=root->data;i++);
if(i>l1)
root->lchild=create1(l1,i-1,l2,l2+i-l1-1);
else
root->lchild=NULL;
if(i<r1)
root->rchild=create1(i+1,r1,l2+i-l1,r2-1);
else
root->rchild=NULL;
return root;
}
TNode* create2(int L1,int R1,int L2,int R2){//已知中后续 建立二叉树,17.50
TNode *p=(TNode *)malloc(sizeof(TNode));
p->data=d[R2];//后续遍历最后一个是根节点
int j=L1;
for(j;c[j]!=d[R2];j++);//一定注意此处加分号!!!j是根节点 在中序遍历中的位置
if(j<R1)
p->rchild=create2(j+1,R1,R2-R1+j,R2-1);
else p->rchild=NULL;
if(j>L1)
p->lchild=create2(L1,j-1,L2,R2-R1+j-1);
else p->lchild=NULL;
return p;
}
void zhong(TNode *T){
if(T!=NULL){
zhong(T->lchild);
printf("%c",T->data);
zhong(T->rchild);
}
}
void hou(TNode *T){
if(T!=NULL){
hou(T->lchild);
hou(T->rchild);
printf("%c",T->data);
}
}
void Free(TNode *T){
if(T!=NULL){
Free(T->lchild);
Free(T->rchild);
free(T);
}
}
void ceng(TNode *T){
TNode *duilie[MAXSIZE];
for(int j=0;j<MAXSIZE;j++)
duilie[j]=NULL;
int r=0,f=0;
duilie[r++]=T;
while(r!=f){
TNode *P=duilie[f++];
printf("%c",P->data);
if(P->lchild) duilie[r++]=P->lchild;
if(P->rchild) duilie[r++]=P->rchild;
}
}
int high(TNode *T){
if(T==NULL) return 0;
else{
int l=high(T->lchild);
int r=high(T->rchild);
return l>r?l+1:r+1;
}
}
int main()
{
int t=0,j=0;
scanf("%d",&t);
for(int x=0;x<t;x++){
scanf("%s",c);
scanf("%s",d);
while(c[j]!='\0'){
j++;
}
TNode *T=create2(0,j-1,0,j-1);
printf("%d",high(T));
j=0;
while(c[j]!='\0'){
j++;
c[j]='\0';
d[j]='\0';
}
Free(T);
printf("\n");
}
return 0;
}