系统中有一棵n个点的完全k叉树,现给出它的DFS先序遍历序列aia_iai,请你还原这棵树,并返回加密后的答案。
答案加密方法:所有边两个端点异或的和,即∑i=1n−1ui xor vi\sum\limits_{i=1}^{n-1}u_i\ xor\ v_ii=1∑n−1ui xor vi,其中(ui,vi)(u_i, v_i)(ui,vi)为一条树上的边。
下面给出完全二叉树的定义:若设二叉树的深度为k,除第 k 层外,其它各层 (1~k-1) 的结点数都达到最大个数,第k层所有的结点都连续集中在最左边。
请你根据这个定义进行适度推广,得到完全k叉树的含义。
示例1
输入
复制
2,[1,2,3,4,5]
返回值
复制
14
说明
树边为(1, 2), (1, 5), (2, 3), (2, 4),加密过程为(12)+(15)+(23)+(24),答案为14。
class Solution {
public:
/**
*
* @param k int整型 表示完全k叉树的叉数k
* @param a int整型vector 表示这棵完全k叉树的Dfs遍历序列的结点编号
* @return long长整型
*/
typedef long long ll;
ll res = 0;
ll kk;
ll cnt = 0;
ll len;
vector<int>b;
void dfs(int x,int y)//x:dfs序里的第几个数 y:bfs序里的第几个数
{
for(int i=1;i<=kk;i++)
{
if(y*kk+i<len)
{
cnt++;
if(cnt<len)
res+=b[x]^b[cnt];
dfs(cnt,y*kk+i);
}
else
return;
}
return;
}
long long tree6(int k, vector<int>& a) {
// write code here
len = a.size();
kk = k;
b = a;
dfs(0,0);
return res;
}
};