還原二叉樹(先序+中序-〉後序)

十二分熱愛發表於2018-08-05

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

輸入格式:

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

輸出格式:

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

輸入樣例:

9
ABDFGHIEC
FDHGIBEAC

輸出樣例:

5

輸入:前序遍歷,中序遍歷

1、尋找樹的root,前序遍歷的第一節點G就是root。
2、觀察前序遍歷GDAFEMHZ,知道了G是root,剩下的節點必然在root的左或右子樹中的節點。
3、觀察中序遍歷ADEFGHMZ。其中root節點G左側的ADEF必然是root的左子樹中的節點,G右側的HMZ必然是root的右子樹中的節點,root不在中序遍歷的末尾或開始就說明根節點的兩顆子樹都不為空。
4、觀察左子樹ADEF,按照前序遍歷的順序來排序為DAFE,因此左子樹的根節點為D,並且A是左子樹的左子樹中的節點,EF是左子樹的右子樹中的節點。
5、同樣的道理,觀察右子樹節點HMZ,前序為MHZ,因此右子樹的根節點為M,左子節點H,右子節點Z。

觀察發現,上面的過程是遞迴的。先找到當前樹的根節點,然後劃分為左子樹,右子樹,然後進入左子樹重複上面的過程,然後進入右子樹重複上面的過程。最後就可以還原一棵樹了:

 實現程式碼:

#include <stdio.h>
#include <stdlib.h>
typedef struct Tree* BT;
struct Tree{
	char data;
	BT left;
	BT right;
};
char in[55],pre[55];
BT findTree(char in[],char pre[],int length)
{
	if(length==0) return NULL;
	BT head = (BT)malloc(sizeof(struct Tree));
	head -> data = pre[0];
	int i=0;
	for(i=0;i<length;i++)
	{
		if(in[i]==pre[0])break;
	}
	head ->left = findTree(in,pre+1,i);
	head -> right=findTree(in+i+1,pre+i+1,length-i-1);
	return head;
}
int length(BT head)
{
	if(head==NULL)return 0;
	int l=length(head->left);
	int r=length(head->right);
	return l>r?l+1:r+1;
}
int main()
{
int n;
scanf("%d",&n);
scanf("%s%s",pre,in);
BT head=(BT)malloc(sizeof(struct Tree));
head=findTree(in,pre,n);
printf("%d\n",length(head));

return 0;	
}

原創:https://blog.csdn.net/islittlehappy/article/details/78501134

相關文章