1. 程式人生 > >浙大資料結構,還原二叉樹

浙大資料結構,還原二叉樹

7-22 還原二叉樹 (25 分)

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

輸入格式:

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

輸出格式:

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

輸入樣例:

9
ABDFGHIEC
FDHGIBEAC

輸出樣例:

5

主要就是用到了遞迴的方式來建立二叉樹,要注意建立的時候,區間的選取和長度。 

#include<iostream>
using namespace std;
typedef struct TreeNode *Position;
typedef Position BinTree;
struct TreeNode {
	BinTree left;
	BinTree right;
	char cp;
};
BinTree findTree(char* in , char* pre , int len) {
	if(len==0)
		return NULL;//空的
	BinTree str=new TreeNode;
	str->cp=*pre;//根節點是先序的第一個
	int temp=0; 
	for(int i=0; i<len; i++) {
		if(in[i]==*pre)//在中序裡找到根節點
			break;
		temp++;
	}
	str->left=findTree(in,pre+1,temp);//用前半部分來建立左子樹
	str->right=findTree(in+temp+1,pre+temp+1,len-temp-1);//用後半部分來建立右子樹,長度還要減去根節點那個 
	return str;//返回根節點
}
int Len(BinTree str) {
	if(str==NULL)
		return 0;
	int l=Len(str->left);//左子樹
	int r=Len(str->right);//右子樹
	return l>r?l+1:r+1;//還有根節點
}
int main() {
	char in[10000],pre[10000];
	int n;
	cin>>n;
	char cp;
	for(int i=0; i<n; i++)	{//先序
		cin>>cp;
		pre[i]=cp;
	}
	for(int i=0; i<n; i++)	{//中序
		cin>>cp;
		in[i]=cp;
	}
	BinTree Node=new TreeNode;
	Node=findTree(in,pre,n);
	cout<<Len(Node)<<endl;
}