import java.util.Scanner;
/*
主要是对于二叉树前序遍历和中序遍历关系转换的理解,对于每个求和节点
脑海中需要构想出空间位置关系
*/
class Main{
static void main(String[] args){
Scanner sc = new Scanner(System.in);
String[] str1 = sc.nextLine().trim().split(" ");
String[] str2 = sc.nextLine().trim().split(" ");
int[] prevSeq = new int[str1.length];
int[] inSeq = new int[str2.length];
boolean[] boolArr = new boolean[str1.length];// 布尔型数组,标记已求和的节点
int[] inSeqRes = new int[str1.length]; // 记录中序遍历的结果求和树
for(int i = 0;i < prevSeq.length;i++){
prevSeq[i] = Integer.parseInt(str1[i]);
inSeq[i] = Integer.parseInt(str2[i]);
}
// 按前序遍历的顺序求解各节点和
for(int i = 0;i < prevSeq.length;i++){
func(prevSeq[i],inSeq,boolArr,inSeqRes);
}
for(int i: inSeqRes){
System.out.print(i+" ");
}
System.out.println();
}
public static void func(int node, int[] inSeq,boolean[] boolArr, int[] inSeqRes){
int index = -1;// index为在中序遍历中找到的需要求和的节点
for(int i = 0;i < inSeq.length;i++){
if(inSeq[i] == node){
index = i;
boolArr[index] = true;
break;
}
}
if(index == -1)
return;// 没有找到就返回
// 对求和节点的左右子树求和
int sum = 0;
for(int i = 0;i < index;i++){
if(boolArr[i]){
continue;// 对于已经标记的节点(已求和),必定是上层节点,直接跳过
}
sum += inSeq[i];
}
for(int i = index + 1;i < inSeq.length;i++){
if(boolArr[i]){
break;
}
sum += inSeq[i];
}
inSeqRes[index] = sum;
}}

京公网安备 11010502036488号