package huaWei03;
import java.util.*;
public class Main {
static List<Integer> list = null;
public static void main(String[] args) {
Main build=new Main();
Scanner in = new Scanner(System.in);
while(in.hasNext()){
list = new ArrayList<Integer>();
int n = in.nextInt();
int[] preOrder = new int[n];
int[] inOrder = new int[n];
for (int i = 0; i < n; i++) {
preOrder[i] = in.nextInt();
}
for (int i = 0; i < n; i++) {
inOrder[i] = in.nextInt();
}
Node root=build.Main(preOrder,0,preOrder.length-1,inOrder,0,preOrder.length-1);
build.postOrder(root);
if(list.size() == preOrder.length){
for (int i = 0; i < preOrder.length; i++) {
System.out.print(list.get(i) + " ");
}
}
else
System.out.print("No");
System.out.println();
}
}
public Node Main(int[] preOrder,int begin1,int end1,int[] inOrder,int begin2,int end2){
if(begin1>end1||begin2>end2){
return null;
}
int rootData=preOrder[begin1];
Node head=new Node(rootData);
int divider=findIndexInArray(inOrder,rootData,begin2,end2);
if(divider == -1) return null;
int offSet=divider-begin2-1;
Node left=Main(preOrder,begin1+1,begin1+1+offSet,inOrder,begin2,begin2+offSet);
Node right=Main(preOrder,begin1+offSet+2,end1,inOrder,divider+1,end2);
head.left=left;
head.right=right;
return head;
}
public int findIndexInArray(int[] a,int x,int begin,int end){
for(int i=begin;i<=end;i++){
if(a[i]==x)return i;
}
return -1;
}
public void preOrder(Node n){
if(n!=null){
System.out.print(n.val+",");
preOrder(n.left);
preOrder(n.right);
}
}
public void inOrder(Node n){
if(n!=null){
inOrder(n.left);
System.out.print(n.val+",");
inOrder(n.right);
}
}
public void postOrder(Node n){
if(n!=null){
postOrder(n.left);
postOrder(n.right);
list.add(n.val);
}
}
class Node{
Node left;
Node right;
int val;
public Node(int val){
this.val=val;
}
public Node getLeft(){
return left;
}
public Node getRight(){
return right;
}
public int getVal(){
return val;
}
}
}
或者
#include <stdio.h>
#define MAX 1000
int to_post(int pre[], int in[], int post[], int n){
int i;
int flag1, flag2;
if (n <= 0)
return 1;
for (i=0; i<n; ++i)
if (in[i] == pre[0])
break;
if (i >= n)
return 0;
post[n-1] = pre[0];
flag1 = to_post (pre+1, in, post, i);
flag2 = to_post (pre+i+1, in+i+1, post+i, n-i-1);
return flag1 && flag2;
}
int main(void){
int pre[MAX], in[MAX], post[MAX];
int n, i;
while (scanf ("%d", &n) != EOF){
for (i = 0; i < n; ++i)
scanf("%d", &pre[i]);
for (i = 0; i < n; ++i)
scanf("%d", &in[i]);
if (to_post (pre, in, post, n)){
for (i = 0; i < n; ++i)
printf("%d ", post[i]);
putchar('\n');
}
else
printf("No\n");
}
return 0;
}