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; }
};