算法与数据结构实验题6.4 order (二叉树)

1、题目:

2、代码:

#include<iostream>
#include<algorithm>
using namespace std;
struct Node
{
	int left;
	int right;
	int father;
	int ord;
} node[100010];
void preOrder(int m)
{
	if(m!=-1)
	{
		cout<<m<<" ";
		preOrder(node[m].left);
		preOrder(node[m].right);
	}
}

void posOrder(int m)
{
	if(m!=-1)
	{
		posOrder(node[m].left);
		posOrder(node[m].right);
		cout<<m<<" ";
	}
}
int main()
{
	int n;
	cin>>n;
	int i;
	for(i=1; i<=n; i++)
	{
		cin>>node[i].father;
	}
	for(i=1; i<=n; i++)
	{
		int x;
		cin>>x;
		node[x].ord=i;
	}
	for(i=1; i<=n; i++)
	{
		node[i].left=-1;
		node[i].right=-1;
	}
	//为每个结点设置儿子 
	for(i=1; i<=n; i++)
	{
		if(node[node[i].father].left==-1)
		{
			node[node[i].father].left=i;
		}
		else
		{
			node[node[i].father].right=i;
		}
	}
	//确认左右子树,调整左右儿子位置 
	for(i=1; i<=n; i++)
	{
		if(node[i].left!=-1&&node[node[i].left].ord>node[i].ord)//如果左儿子在中序中的位置大于父亲在中序的位置,
		//说明这个应该是右儿子 
		{
			swap(node[i].left,node[i].right);
		}
		if(node[i].right!=-1&&node[node[i].right].ord<node[i].ord)//如果右儿子在中序中的位置小于父亲在中序的位置,
		//说明这个应该是左儿子
		{
			swap(node[i].left,node[i].right);
		}
	}
	preOrder(1);
	cout<<endl;
	posOrder(1);
	cout<<endl;
	return 0;
}
posted @ 2016-10-31 11:02  laixl  阅读(337)  评论(0编辑  收藏  举报