class Solution {
public:
/**
*
* @param a int整型vector 表示这棵完全二叉树的Dfs遍历序列的结点编号
* @return long长整型
*/
long long tree5(vector<int>& a) {
// write code here
int len = a.size();
long long ans = 0;
cal(a, 0, len, ans);
return ans;
}</int>
void cal(vector<int>&a, int beg, int end, long long &ans){
int len = end - beg;
int root = a[beg];
//确定层数
auto it = cal_level(len);
if(it.first != 0){
int tmp = root ^ a[beg + 1];
ans += tmp;
cal(a, beg + 1, beg + it.first + 1, ans);
}
if(it.second != 0){
int tmp = root ^ a[beg + it.first + 1];
ans += tmp;
cal(a, beg + it.first + 1, end, ans);
}
}
//计算左右子树长度
pair<int,int> cal_level(int len){
int level = 0;
int left = 0, right = 0;
for(int i = 0;i < 30; ++i){
if(pow(2, i) <= len && pow(2, i + 1) > len){
level = i;
break;
}
}
if(pow(2, level) - 1 + pow(2, level - 1) - 1 >= len - 1){
right = pow(2, level - 1) - 1;
left = len - 1 - right;
}else{
left = pow(2, level) - 1;
right = len - 1 - left;
}
pair<int, int>ans(left,right);
return ans;
}};

京公网安备 11010502036488号