牛客编程巅峰赛S2第3场 Tree VI (树,dfs)
-
题意:给你一个\(n\)个点的完全\(k\)叉树的先序遍历序列\(a\),还原这颗树并且求所有两个端点的异或和.
-
题解:用dfs在还原树的时候,把子节点和父亲节点的异或贡献给答案,对于每个节点,我们找它所有的子节点(从左到右),如果子节点合法就不断递归求贡献即可.
-
代码:
class Solution { public: /** * * @param k int整型 表示完全k叉树的叉数k * @param a int整型vector 表示这棵完全k叉树的Dfs遍历序列的结点编号 * @return long长整型 */ typedef long long ll; ll res=0; int cur=1; int kk; vector<int> b; void dfs(int u,int fa){ for(int i=1;i<=kk;++i){ if(kk*u+i>=b.size()) return; cur++; res+=b[cur-1]^b[fa-1]; dfs(kk*u+i,cur); } } long long tree6(int k,std::vector<int>& a) { // write code here kk=k; b=a; dfs(0,1); return res; } };
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮