数据结构实验之二叉树八:(中序后序)求二叉树的深度,已知中序后序遍历序列建立二叉树

一定注意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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值