变式--二叉树的遍历求和--求和树
将满二叉树转换为求和树
https://www.nowcoder.com/questionTerminal/b31734e46ba644de85a9cf95bbd57a5f
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; }
}