1. 程式人生 > >還原二叉樹(25 分)

還原二叉樹(25 分)

給定一棵二叉樹的先序遍歷序列和中序遍歷序列,要求計算該二叉樹的高度。

輸入格式:

輸入首先給出正整數N(≤50),為樹中結點總數。下面兩行先後給出先序和中序遍歷序列,均是長度為N的不包含重複英文字母(區別大小寫)的字串。

輸出格式:

輸出為一個整數,即該二叉樹的高度。

輸入樣例:

9
ABDFGHIEC
FDHGIBEAC

輸出樣例:

5

 

#include <iostream>
#include<vector>
#include <stdlib.h>
#include<algorithm>
#define NIL -1
using namespace std;

char a[10000],b[10000];

struct tree{
	char data;
	struct tree *left,*right;
};

struct tree *rec(int q,int z,int n)
{
	int i,j,k;
	if(n<=0)
	return NULL;
	struct tree *T;
	T=(struct tree *)malloc(sizeof(struct tree));
	char root=a[q];
	T->data=a[q];
	for(i=0;b[z+i]!=root;i++);
	T->left=rec(q+1,z,i);
	T->right=rec(q+i+1,z+i+1,n-i-1);
	return T;
}

int height(struct tree *T)
{
	if(!T)
	return 0;
	int hl=height(T->left);
	int hr=height(T->right);
	return hr>hl? hr+1:hl+1;
}

int main()
{
	int i,j,n;
	scanf("%d",&n);
	getchar();
	for(i=0;i<n;i++)
	{
		scanf("%c",&a[i]);
	}
	getchar();
	for(i=0;i<n;i++)
	{
		scanf("%c",&b[i]);
	}
	struct tree *T=rec(0,0,n); 
	int h=height(T);
	printf("%d",h);
}