/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @param k int整型 
     * @return TreeNode类
     */
    TreeNode* cyclicShiftTree(TreeNode* root, int k) {
        // write code here
        if(!root){
            return nullptr;
        }
        queue<TreeNode*> cur_level;
        cur_level.push(root);
        vector<TreeNode*> level;
        level.emplace_back(root);
        tree.emplace_back(level);
        level.clear();
        
        while(!cur_level.empty())
        {
            TreeNode *cur_node=cur_level.front();
            cur_level.pop();
            if(cur_node)
            {
               
                if(cur_node->left)
                {
                    level.push_back(cur_node->left);
                }
                if(cur_node->right)
                {
                    level.push_back(cur_node->right);
                }
            }
            
            if(cur_level.empty())
            {
                tree.emplace_back(level);
                for(int i=0;i<level.size();i++)
                {
                    cur_level.push(level[i]);
                }
                level.clear();
            }
        }
        int deepth=tree.size();
        
        for(int i=deepth-2;i>=0;i--)
        {
            int len=tree[i].size();
            level=vector<TreeNode*>(len*2,nullptr);
            
            for(int j=0;j<len;j++)
            {
                if(tree[i][j]->left)
                {
                    level[((j*2)+k)%(len*2)]=tree[i][j]->left;
                }
                if(tree[i][j]->right)
                {
                    level[((j*2+1)+k)%(len*2)]=tree[i][j]->right;
                }
            }
            for(int j=0;j<len;j++)
            {
                tree[i][j]->left=level[j*2];
                tree[i][j]->right=level[j*2+1];
            }
        }
        return root;
    }
private:
    vector<vector<TreeNode*>> tree;
};

层序遍历,把树存到二维数组里面,然后模拟右移就行了。