7-2 还原二叉树(25 分)
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入格式:
输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输出格式:
输出为一个整数,即该二叉树的高度。
输入样例:
9
ABDFGHIEC
FDHGIBEAC
输出样例:
5
第一种:传入数组方式:
#include<bits/stdc++.h>
using namespace std;
typedef struct TNode
{
char data;
struct TNode *lchild,*rchild;
} TNode,*Tree;
Tree CreatTree( char xian[],char zhong[],int n)
{
if( n<=0 ) return NULL;
int index = 0;
Tree temp = (Tree) malloc(sizeof(struct TNode));
while( index < n)
{
if( zhong[index]==xian[0]) break;
index ++;
}
temp->data = xian[0];
temp->lchild = CreatTree(xian+1,zhong,index);
temp->rchild = CreatTree(xian+1+index,zhong+index+1,n-index-1);
return temp;
}
int High( Tree t)
{
if( !t ) return 0;
int m = High(t->lchild);
int n = High(t->rchild);
if( m>n ) return ++m;
else return ++n;
}
char xian[55];
char zhong[55];
int N;
int main()
{
scanf("%d",&N);
for(int i=0;i<N;i++)
cin>>xian[i];
for(int i=0;i<N;i++)
cin>>zhong[i];
Tree tree = CreatTree( xian,zhong,N);
printf("%d",High(tree));
return 0;
}
第二种:传入数组下标的方式:
#include<bits/stdc++.h>
using namespace std;
typedef struct TNode
{
char data;
struct TNode *lchild,*rchild;
} TNode,*Tree;
char xian[55];
char zhong[55];
int N;
Tree CreatTree(int x,int z,int n)
{
int i;
if(n<=0)
return NULL;
Tree t=(Tree)malloc(sizeof(TNode));
for(i=0;xian[x]!=zhong[z+i];i++);
t->lchild=CreatTree(x+1,z,i);
t->rchild=CreatTree(x+i+1,z+i+1,n-i-1);
return t;
}
int High( Tree t)
{
if( !t ) return 0;
int m = High(t->lchild);
int n = High(t->rchild);
if( m>n ) return ++m;
else return ++n;
}
int main()
{
scanf("%d",&N);
for(int i=0;i<N;i++)
cin>>xian[i];
for(int i=0;i<N;i++)
cin>>zhong[i];
Tree tree = CreatTree(0,0,N);
printf("%d",High(tree));
return 0;
}