题目描述
系统中有一棵n个点的完全k叉树,现给出它的BFS层序遍历序列a[i](即从根节点开始,每一层从左向右遍历),请你还原这棵树,并返回加密后的答案。
题解
这道题只是单纯的考察了满m叉树的性质,以及树的存储。
我们从1开始对节点进行编号,可以有如下性质:
第 i 个结点的第一个孩子结点是 (i-1)*m+2
所以我们易推第 i 个结点的第 j 个孩子结点是 (i-1)*m + 1 + j
这样答案很明显了 直接加和判断即可
只要子节点的下标值大于数组长度跳出循环即可。
代码
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param k int整型 表示完全k叉树的叉数k
* @param a int整型一维数组 表示这棵完全k叉树的Bfs遍历序列的结点编号
* @return long长整型
*/
public static long tree2 (int k, int[] a) {
// write code here
int len = a.length;
if(len == 1) {
return 0; //特判
}
long ans = 0;
for(int i = 1;i < len; i++){
int x = 0, y = 0;
for(int j = 1;j <= k; j++){
x = i;
y = (i-1) * k + 1 + j;
if(y > len) {
break;
}
ans += sum(x, y, a);
}
if(y > len) {
break;
}
}
return ans;
}
private static long sum(int x, int y, int[] a){
return a[x-1] ^ a[y-1];
}
}