1. 程式人生 > >資料結構與演算法題目集7-23——還原二叉樹

資料結構與演算法題目集7-23——還原二叉樹

我的資料結構與演算法題目集程式碼倉:https://github.com/617076674/Data-structure-and-algorithm-topic-set

原題連結:https://pintia.cn/problem-sets/15/problems/838

題目描述:

知識點:根據前序遍歷和中序遍歷重建二叉樹、二叉樹的層序遍歷

思路:先根據前序遍歷和中序遍歷重建二叉樹,再層序遍歷計算高度

時間複雜度和空間複雜度均是O(N)。

C++程式碼:

#include<iostream>
#include<cstring>
#include<queue>

using namespace std;

struct node{
	char c;
	int lchild, rchild;
};

int N, num = 0;
vector<char> preOrder, inOrder;
node Node[50];
int height = 0;

int create(int preLeft, int preRight, int inLeft, int inRight);
void levelOrderTraversal(int root);

int main(){
	scanf("%d", &N);
	char input1[N + 1], input2[N + 1];
	scanf("%s", input1);
	for(int i = 0; i < strlen(input1); i++){
		preOrder.push_back(input1[i]);
	}
	scanf("%s", input2);
	for(int i = 0; i < strlen(input2); i++){
		inOrder.push_back(input2[i]);
	}
	int root = create(0, preOrder.size() - 1, 0, inOrder.size() - 1);
	levelOrderTraversal(root);
	printf("%d\n", height);
	return 0;
} 

int create(int preLeft, int preRight, int inLeft, int inRight){
	if(preLeft > preRight){
		return -1;
	}
	int head = num++;
	Node[head].c = preOrder[preLeft];
	int k;
	for(int i = inLeft; i <= inRight; i++){
		if(inOrder[i] == preOrder[preLeft]){
			k = i;
			break;
		} 
	}
	int numLeft = k - inLeft;
	Node[head].lchild = create(preLeft + 1, preLeft + numLeft, inLeft, k - 1);
	Node[head].rchild = create(preLeft + numLeft + 1, preRight, k + 1, inRight);
	return head;
}

void levelOrderTraversal(int root){
	queue<int> q;
	q.push(root);
	while(!q.empty()){
		int qSize = q.size();
		for(int i = 0; i < qSize; i++){
			int u = q.front();
			q.pop();
			if(Node[u].lchild != -1){
				q.push(Node[u].lchild);
			}
			if(Node[u].rchild != -1){
				q.push(Node[u].rchild);
			}
		}
		height++;
	}
}

C++解題報告: