算法与数据结构实验题 6.4 order

实验任务

给出一棵二叉树的中序遍历和每个节点的父节点,求这棵二叉树的先序和后序遍历。

数据输入

输入第一行为一个正整数 n 表示二叉树的节点数目,节点编号从 1 到 n,其中 1 为根节点。

第 2 行有 n 个数字,第 i 个数字表示 i 的父亲节点。(1 的父亲节点为 0,表示无)

第 3 行为中序遍历。

30%的数据:n<=20;

60%的数据:n<=1000;

100%的数据:n<=10000;

数据输出

输出 2 行,第一行为先序遍历,第二行为后序遍历。

输入示例

10
0 7 2 2 9 1 8 1 6 8
9 5 6 1 10 8 7 3 2 4

输出示例

1 6 9 5 8 10 7 2 3 4
5 9 6 10 3 4 2 7 8 1

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=2e9+1;

int n,m;
struct{
	int ls,rs,ord;
}node[100010];

void preorder(int x) {
	if(x==0) return;
	printf("%d ",x);
	preorder(node[x].ls);
	preorder(node[x].rs);
}
void posorder(int x) {
	if(x==0) return;
	posorder(node[x].ls);
	posorder(node[x].rs);
	printf("%d ",x);
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) {
		scanf("%d",&m);
		if(node[m].ls==0) node[m].ls=i;
		else node[m].rs=i;
	}
	for(int i=1;i<=n;i++) {
		scanf("%d",&m);
		node[m].ord=i;
	}
	for(int i=1;i<=n;i++) {
		if(node[i].ls!=0&&node[node[i].ls].ord>node[i].ord) swap(node[i].ls,node[i].rs);
		if(node[i].rs!=0&&node[node[i].rs].ord<node[i].ord) swap(node[i].ls,node[i].rs);
	}
	preorder(1);
	printf("\n");
	posorder(1);
	return 0;
}

思路
本题考查二叉树的基本概念

我们在输入时记录中序遍历时,每个节点的相对位置,利用中序遍历中,两颗子树的相对位置不变的性质,在利用父节点的条件构建好树之后,进行左右儿子的调整,最终输出先序与后序的结果

二改:简化代码

posted @ 2024-11-25 23:20  Severj  阅读(296)  评论(0)    收藏  举报