算法与数据结构实验题 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;
}
思路
本题考查二叉树的基本概念
我们在输入时记录中序遍历时,每个节点的相对位置,利用中序遍历中,两颗子树的相对位置不变的性质,在利用父节点的条件构建好树之后,进行左右儿子的调整,最终输出先序与后序的结果
二改:简化代码