题解 | #循环右移二叉树#

循环右移二叉树

https://www.nowcoder.com/practice/dd954e299e534af3986a73f98dbdd8a7

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

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

全部评论

相关推荐

03-10 11:23
门头沟学院 Java
鹿LF:计算机面试就跟数学题一样,没什么实际价值,但只能这么筛选,本质是考察你的努力,智力和学习能力
点赞 评论 收藏
分享
Kurumis:整个简历看下来就发现你其实对测试理解还很浅,很多地方都是硬凑上去,项目也是学生课设级别,没什么含金量 首先是学习建议: 1.系统性了解一个真实工程的框架,有利于你后续提升项目含金量,理解测试的逻辑 2.真正去学一下自动化测试和性能测试 再就是简历本身包装问题: 1.投测试的话就不要说自己独立开发自己测,专注描述自己怎么做测试的 2.项目经历太像套话,很容易让人怀疑你到底真的做过没有,比如并发是具体做了多少并发?自动化脚本是怎么跑兼容性和性能测试的?测试用例写了多少条? 3.教务管理系统一听就是数据库课设作业,含金量不高,不过你可以在原项目基础上重构扩展,比如添加docker容器部署MySQL和Redis,添加消息队列和锁机制防止系统扛不住高并发访问,让它真的像个实际工程 4.技能里性能专项测试没有把握不要乱写,就写你会什么工具就行了,做专项性能测试的都是行业大佬,你要写的话一定要有对应的专项性能测试项目 5.可以在简历里附上项目链接,压缩简历内容的同时提升简历真实性
今天你投了哪些公司?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务