题目

系统中有一棵 个点的完全二叉树,现给出它的 BFS 层序遍历序列 ,请还原这棵树,并返回加密后的答案。
答案加密方法:所有边两个端点异或的和,即 ,其中 为一条树上的边。

解题思路

将完全二叉树按照层次遍历的顺序从 1 开始编号,则节点 的左孩子节点为 ,右孩子节点为 ,所以 是树上的边,计算每条边的两个端点的异或值,累加后返回答案。

C++代码

class Solution {
public:
    /**
     * 
     * @param a int整型vector 表示这棵完全二叉树的Bfs遍历序列的结点编号
     * @return long长整型
     */
    long long tree1(vector<int>& a) {
        // write code here
        int n = a.size();
        long long ans = 0;
        for(int i=1; i<=n; ++i){
            int left = i<<1;
            int right = left + 1;
            if(left <= n){
                ans += a[i-1] ^ a[left-1];
            }
            if(right <= n){
                ans += a[i-1] ^ a[right-1];
            }
        }
        return ans;
    }
};