【PAT Advanced Level】1020. Tree Traversals (25)

这题给定后序和中序遍历的结点顺序,要求层序遍历的结点顺序。

可以通过后序和中序构造出这棵树,然后再BFS给出层序遍历。构造的规则为:

1. 找到后序遍历的最后一个元素,这个元素肯定是整个树的根。

2. 根据上面找到的元素,将中序遍历的序列分为两边,左边肯定是根的左子树,右边是根的右子树

3. 递归左子树和右子树

#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
#include <queue>
using namespace std;

int k;
vector<int> post;
vector<int> in;
vector<int> reslut;

struct tree_node
{
	int data;
	tree_node *left;
	tree_node *right;
	tree_node() 
	{
		left = NULL;
		right = NULL;
	}
};
tree_node *root;
 tree_node *preOrder(vector<int>::iterator pBegin, vector<int>::iterator pEnd, vector<int>::iterator iBegin, vector<int>::iterator iEnd, tree_node *root)
{
	if(pBegin == pEnd || iBegin == iEnd)
		return NULL;
	int tmp = *(pEnd - 1);
	root = new tree_node;
	root->data = tmp;
	vector<int>::iterator index = find(iBegin, iEnd, tmp);
	root->left = preOrder(pBegin, pBegin + (index - iBegin), iBegin, index, root->left);
	root->right = preOrder(pBegin + (index - iBegin), pEnd - 1, index + 1, iEnd, root->right);
	return root;
}

 void BSF()
 {
	 queue<tree_node *> q;
	 q.push(root);
	 while (!q.empty())
	 {
		 tree_node *tmp = q.front();
		 q.pop();
		 reslut.push_back(tmp->data);
		 if(tmp->left != NULL) q.push(tmp->left);
		 if(tmp->right != NULL) q.push(tmp->right);
	 }
 }

int main()
{
	//fstream cin("a.txt");
	cin>>k;
	int tmp = k;
	post.push_back(0);
	in.push_back(0);
	while (tmp--)
	{
		int node;
		cin>>node;
		post.push_back(node);
	}
	tmp = k;
	while (tmp--)
	{
		int node;
		cin>>node;
		in.push_back(node);
	}
	root = preOrder(post.begin() + 1, post.end(), in.begin() + 1, in.end(), root);
	BSF();
	for(int i = 0; i < reslut.size(); i++)
	{
		if(i == 0)
			cout<<reslut[i];
		else
			cout<<" "<<reslut[i];
	}
	cout<<endl;
}


你可能感兴趣的:(【PAT Advanced Level】1020. Tree Traversals (25))