题解 | #按之字形顺序打印二叉树#

按之字形顺序打印二叉树

http://www.nowcoder.com/practice/91b69814117f4e8097390d107d2efbe0

思路:
层序遍历,奇数层从左到右,偶数层从右到左打印
首先层序遍历,使用队列,每一层的结果存在qvec中,此时的qvec中每一层都是从左到右的,设定一个标志flag,表示层数,当flag是奇数时,直接将qvec给res;当flag为偶数时,将qvec的内容反转再给res。
注:由于我太菜,在反转的时候又加了一个栈进行反转,代码见50行注释掉的原始部分。实际上一个reverse函数就可以搞定。

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    vector<vector<int> > Print(TreeNode* pRoot) {

        vector<vector<int>> res;
        queue<TreeNode*> Queue;
        Queue.push(pRoot);
        int flag = 0;

        if(!pRoot) return res;
        while(Queue.size() > 0)
        {
            vector<int> qvec;
            int size = Queue.size();
            while(size > 0)//层次遍历,qvec记录每层内容
            {
                TreeNode* node = Queue.front();
                Queue.pop();
                qvec.push_back(node->val);
                size--;
                if(node->left)
                {
                    Queue.push(node->left);
                }
                if(node->right)
                {
                    Queue.push(node->right);
                }
            }
            flag += 1;
            if(flag%2 && qvec.size()>0)//flag是奇数
            {
                res.push_back(qvec);
            }
            if(!(flag%2) && qvec.size()>0)//flag是偶数
            {
                //优化
                reverse(qvec.begin(), qvec.end());
                res.push_back(qvec);
                //原始
                /*stack<int> Stack;
                for(int i=0;i<qvec.size();++i)
                {
                    Stack.push(qvec[i]);
                }
                qvec.clear();
                while(Stack.size()>0)
                {
                    int tmp = Stack.top();
                    qvec.push_back(tmp);
                    Stack.pop();
                }
                res.push_back(qvec);*/
            }
        }
        return res;
    }

};
牛客刷题记录 文章被收录于专栏

记录自己的刷题记录,刷过的题的解法

全部评论

相关推荐

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

创作者周榜

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