4-14 還原二叉樹 (15分)

紺香零八發表於2020-11-02

4-14 還原二叉樹 (15分)

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

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

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

輸入樣例:

9
ABDFGHIEC
FDHGIBEAC

輸出樣例:

5

Code:

使用兩個板子:先序和中序建樹+求高度
先序和中序建樹板子理解BTree buildtree(int root,int start,int end)
先序(根左右)最先出現的總是根結點,
root為當前先序的根結點下標(根據當前的中序序列可以把當前的中序分為左根右)
start為當前中序序列起始位置
end為當前中序序列結束位置
k為當前中序序列的根結點位置,分割當前中序序列左右子樹的下標

#include<bits/stdc++.h>
using namespace std;
typedef struct btnode{
	char data;
	struct btnode *left,*right;
}btnode,*BTree;
vector<char> pre,in;
BTree buildtree(int root,int start,int end){
	if(start>end) return NULL;
	int k;
	for(k=start;k<end;k++) if(in[k]==pre[root]) break;
    BTree node = (BTree)malloc(sizeof(btnode));
	node->data = pre[root];
	node->left = buildtree(root+1,start,k-1);  
	//當前中序序列的左子樹,root+1為當前中序左子樹的根結點位置
	node->right = buildtree(root+1+k-start,k+1,end);  
	//當前中序序列的右子樹,root+1為當前中序左子樹的根結點位置,k-start為當前中序序列左子樹的個數,相加為當前中序序列右子樹的根結點位置
	return node;
}
int getHeight(BTree bt){
	if(!bt) return 0;
	int left = getHeight(bt->left);
	int right = getHeight(bt->right);
	return max(left,right)+1;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	int N;
	scanf("%d",&N);getchar();
	pre.resize(N);
	in.resize(N);
	for(int i=0;i<N;i++) scanf("%c",&pre[i]);
	getchar();
	for(int i=0;i<N;i++) scanf("%c",&in[i]);
	BTree t = buildtree(0,0,N-1);
	cout << getHeight(t);
	return 0;
}

相關文章