PTA L2-011 玩转二叉树

这道题和L2-006树的遍历是几乎一样的思路,都是通过两个遍历序列得到原来的树,然后再进行层序遍历。
这题的细小区别在于给的是前序遍历,因此这次的根结点应该是序列的第一个。
第一次写的时候写了个翻转的函数,但是之后又想了想,只要在层序遍历时先push右子树就实现了翻转,因此可以省略这个函数。

#include
#include
using namespace std;

int inorder[40];
int preorder[40];
int ltree[40];
int rtree[40];
int n;

//l1,r1描述中序,l2,r2描述前序
int rebuild(int l1, int r1, int l2, int r2)
{
	if (l1 > r1)
		return 0;
	int root = preorder[l2];
	int i = 0;
	while (inorder[l1+ i] != root)i++;
	ltree[root] = rebuild(l1, l1 + i - 1, l2 + 1, l2 + i);
	rtree[root] = rebuild(l1 + i + 1, r1, l2 + i + 1, r2);
	return root;
}

void reverse(int root)
{
	int tmp_l = 0 , tmp_r = 0;
	if (ltree[root]||rtree[root])
	{
		int tmp = ltree[root];
		tmp = rtree[root];
		rtree[root] = ltree[root];
		ltree[root] = tmp;
		reverse(ltree[root]);
		reverse(rtree[root]);
	}
	return;
}

int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)cin >> inorder[i];
	for (int i = 0; i < n; i++)cin >> preorder[i];

	int root = rebuild(0, n - 1, 0, n - 1);
	//reverse(root);
	queue q;
	q.push(root);
	while (!q.empty())
	{
		int tmp = q.front();
		q.pop();
		if (tmp == root)
			cout << tmp;
		else
			cout << " " << tmp;
		if (rtree[tmp])q.push(rtree[tmp]);
		if (ltree[tmp])q.push(ltree[tmp]);

	}
	cout << endl;
	system("pause");
	return 0;
}

你可能感兴趣的:(算法)