题目描述
给出满二叉树,编写算法将其转化为求和树
什么是求和树:二叉树的求和树, 是一颗同样结构的二叉树,其树中的每个节点将包含原始树中的左子树和右子树的和。
二叉树:
10
/ \
-2 6
/ \ / \
8 -4 7 5
求和树:
20(4-2+12+6)
/ \
4(8-4) 12(7+5)
/ \ / \
0 0 0 0
二叉树给出前序和中序输入,求和树要求中序输出;
所有处理数据不会大于int;
输入描述:
2行整数,第1行表示二叉树的前序遍历,第2行表示二叉树的中序遍历,以空格分割
输出描述:
1行整数,表示求和树的中序遍历,以空格分割
示例1
输入
10 -2 8 -4 6 7 5
8 -2 -4 10 7 6 5
输出
0 4 0 20 0 12 0
思路:本质上考察的还是二叉树的遍历方式,我们已知前序和中序遍历,是能够通过递归的方式还原整棵树的,而这道题需要对树进行求和,我们可以直接在遍历树的过程中求解即可。
import java.util.*;
public class Main{
public static List<Integer> list3;
public static void main(String[] args){
String s1,s2;
Scanner in=new Scanner(System.in);
s1=in.nextLine();
s2=in.nextLine();
List<Integer> list1=new ArrayList<>();
List<Integer> list2=new ArrayList<>();
list3=new ArrayList<>();
for(String s : s1.split("\\s+"))
list1.add(Integer.valueOf(s));
for(String s : s2.split("\\s+")){
list2.add(Integer.valueOf(s));
list3.add(Integer.valueOf(s));
}
dfs(list1,list2,0,list1.size()-1,0,list2.size()-1);
for(int i=0;i<list3.size();i++)
System.out.print(list3.get(i)+" ");
System.out.println();
}
public static int dfs(List<Integer> list1,List<Integer> list2,int l,int r,int ls,int rs){
if(l>r || ls>rs)
return 0;
if(ls==rs) {
list3.set(ls,0);
return list2.get(ls);
}
int p=ls;
for(int i=ls;i<=rs;i++){
if(list1.get(l)==list2.get(i)){
p=i;
break;
}
}
int sum=0;
sum+=dfs(list1,list2,l+1,l+p-ls,ls,p-1);
sum+=dfs(list1,list2,l+p-ls+1,r,p+1,rs);
list3.set(p,sum);
return sum+list2.get(p);
}
}