返回顶部

牛客编程巅峰赛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;
        }
    };
    
    
posted @ 2020-11-25 15:30  Rayotaku  阅读(84)  评论(0编辑  收藏  举报