给出一棵二叉树的中序遍历和每个节点的父节点,求这棵二叉树的先序和后序遍历。
输入格式:第一行一个数n表示二叉树的节点数目,节点编号从1到 n,其中1为根节点;第二行有n个数字,第i个数字表示i的父亲节点。(1的父亲节点为0,表示无);第三行为中序遍历。
输出格式:第一行为先序遍历,第二行为后序遍历。
#include <iostream>
using namespace std;
struct Tree{
int son[2];
int left,right;
int num;
};
void first_ring(struct Tree *tree,int i){
if(i==0)return;
int l=tree[i].left,r=tree[i].right;
cout<<i<<" ";first_ring(tree,l);first_ring(tree,r);
}//先序:最先输出根,然后是左子树右子树
void last_ring(struct Tree *tree,int i){
if(i==0)return;
int l=tree[i].left,r=tree[i].right;
last_ring(tree,l);last_ring(tree,r);
cout<<i<<" ";
}//后序:最后输出根,然后是左子树右子树
int main(){
int n;cin>>n;
struct Tree *tree=new struct Tree[n+1];
for(int i=1;i<=n;i++){//第一行初始化
tree[i].num=0;
tree[i].left=0;tree[i].right=0;
tree[i].son[0]=0;tree[i].son[1]=0;
}
for(int i=1;i<=n;i++){//第二行,父子节点的关系
int m;cin>>m;
if(m==0)continue;
int k=tree[m].num;
tree[m].son[k]=i;
tree[m].num++;
}
int a[n+1];for(int i=1;i<=n;i++)cin>>a[i];//第三行,中序遍历数组
for(int i=1;i<=n;i++){//遍历中序遍历数组
int k=a[i];
for(int j=1;j<=n;j++){
if(tree[k].son[0]==a[j]){//若当前节点n的第一个孩子在中序遍历中
if(j<i)tree[k].left=a[j];
if(j>i)tree[k].right=a[j];
}
if(tree[k].son[1]==a[j]){
if(j<i)tree[k].left=a[j];
if(j>i)tree[k].right=a[j];
}
}
}first_ring(tree,1);cout<<endl;last_ring(tree,1);
}//从根节点1开始遍历

6137

被折叠的 条评论
为什么被折叠?



