#include <stdio.h>
#include<stdlib.h>
#include<math.h>
#define max 100
typedef struct BiTNode{
char data;
struct BiTNode * lchild;
struct BiTNode * rchild;
}BiTNode,* BiTree;
int Find(char x,char *zhong,int n)
{
for(int i=0;i<n;i++)
{
if(zhong[i]==x)
{
return i;
}
}
}
BiTNode *build(int n,char *xian,char *zhong)//给出先序与中序,可以确定二叉树,n代表某次调用传入的节点数
{
if(n==0) return NULL;
char c=xian[0];
int index=Find(c,zhong,n);//找出当前先序序列中第一个节点(某个树的根节点)在中序中的位置
BiTNode * tmp=(BiTNode * )malloc(sizeof(BiTNode));
tmp->data=c;//tmp是整棵树的根节点
tmp->lchild=build(index,xian+1,zhong);//当前节点的左子树的先序序列和中序序列传入,他们的过程是一样的,更新先序序列后的第一个即为当前节点左子树的根节点
tmp->rchild=build(n-index-1,xian+1+index,zhong+1+index);//当前节点的右子树的先序序列和中序序列
return tmp;
}
int Depth(BiTree T){//函数名和内部变量同名引发错误depth
int depth;
if(!T)
depth=0;
else
depth=(Depth(T->lchild) > Depth(T->rchild)? Depth(T->lchild): Depth(T->rchild))+1;
return depth;
}
int main(){
int n,depth;
BiTree T;
char pre[max],inorder[max];
scanf("%d",&n);
scanf("%s %s",pre,inorder);
T=build(n,pre,inorder);
depth = Depth(T);
printf("%d",depth);
return 0;
}
结尾附一个已知后序序列和中序序列,建立二叉树
BiTNode *build(int n,int *hou,int *zhong)
{
if(n==0) return NULL;
char c=hou[n-1];
int index=Find(c,zhong,n);
BiTNode * tmp=(BiTNode * )malloc(sizeof(BiTNode));
tmp->data=c;
tmp->lchild=build(index,hou,zhong);//当前节点的左子树的后序序列和中序序列传入
tmp->rchild=build(n-index-1,hou+index,zhong+1+index);//当前节点的右子树的后序序列和中序序列
return tmp;
}