中序遍历,层次遍历构建二叉树

问题 C: 还原二叉树

时间限制: 1 Sec
内存限制: 128 MB
提交: 327
解决: 158
提交
状态

题目描述

给一棵二叉树的层序遍历序列和中序遍历序列,求这棵二叉树的先序遍历序列和后序遍历序列。

输入

每个输入文件中一组数据。

第一行一个正整数N(1<=N<=30),代表二叉树的结点个数(结点编号为1~N)。接下来两行,每行N个正整数,分别代表二叉树的层序遍历序列和中序遍历序列。数据保证序列中1~N的每个数出现且只出现一次。

输出

输出两行,每行N个正整数,分别代表二叉树的先序遍历序列和后序遍历序列。每行末尾不输出额外的空格。

样例输入

73 5 4 2 6 7 12 5 3 6 4 7 1

样例输出

3 5 2 4 6 7 12 5 6 1 7 4 3

题目链接:点击打开链接

卡了真久,开始自己写,整整两个钟都没AC,整个人心情都不好了,还是自己太菜了。参考了晴神代码,点击打开链接,也算作一次总结吧!!

#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
#include <cmath>
#include <queue>
#include <algorithm>
#include <stack>
#include <cstring>
#include <set>
#include <map>
using namespace std;

const int maxn = 30;

int n;
vector<int> lev_order, in_order;
bool temp_vis[maxn];

struct Node {
	int data;
	Node *left;
	Node *right;
	Node() {
		left = NULL;
		right = NULL;
	}
};

Node *build(vector<int> lev, int left, int right) {
	if (lev.size() == 0) return NULL;
	Node *temp = new Node();
	temp->data = lev[0];
	int pos;
	for (int i = left; i <= right; i++) {
		if (lev[0] == in_order[i]) {
			pos = i;
			break;
		}
	}
	
	int left_b = left;
	int right_b = pos - 1;
	memset(temp_vis, false, sizeof(temp_vis));
	for (int i = left_b; i <= right_b; i++) {
		temp_vis[in_order[i]] = true; // 访问中序数组的左子树
	}
	vector<int> temp_left, temp_right;
	for (int i = 1; i < lev.size(); i++) {
		if (temp_vis[lev[i]]) {
			temp_left.push_back(lev[i]); // 从层次遍历中选出左子树
		} else {
			temp_right.push_back(lev[i]); // 从层次遍历中选出右子树
		}
	}
	temp->left = build(temp_left, left, right_b);
	temp->right = build(temp_right, pos + 1, right);
	return temp;
}

vector<int> ans_pre;
void visit_pre(Node *&root) {
	if (root == NULL) return;
	ans_pre.push_back(root->data);
	visit_pre(root->left);
	visit_pre(root->right);
}

vector<int> ans_pos;
void visit_pos(Node *&root) {
	if (root == NULL) return;
	visit_pos(root->left);
	visit_pos(root->right);
	ans_pos.push_back(root->data);
}

void print_ans(vector<int> &ans) {
	for (int i = 0; i < n; i++) {
		cout << ans[i];
		if (i != n - 1) cout << " ";
	}
	cout << endl;
}

int main() {
	int x;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> x;
		lev_order.push_back(x);
	}
	for (int i = 0; i < n; i++) {
		cin >> x;
		in_order.push_back(x);
	}
	Node *root = build(lev_order, 0, n - 1);
	visit_pre(root);
	visit_pos(root);
	print_ans(ans_pre);
	print_ans(ans_pos);
	return 0;
}
    原文作者:边城浪子_2013
    原文地址: https://blog.csdn.net/tianman90/article/details/59057673
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞