题解 | #二叉树的之字形层序遍历#

二叉树的之字形层序遍历

http://www.nowcoder.com/practice/47e1687126fa461e8a3aff8632aa5559

题解一: 层次遍历
解题思路: 通过一个level参数用来指示本层需要如何将队列中的元素填入到向量中。
分析:
1.首先初始化level = 0,如果level%2==0,则本层是从左往右打印; 如果level%2 == 1,则本层从右往左打印;
2. 因为每次将一层节点加入到队列之后,我们都可以知道队列保存值的数量,所以我们只需要控制填入向量中的顺序就行。
图示:
图片说明
复杂度分析:
时间复杂度:O(N) 每个节点遍历一次
空间复杂度:O(N)
实现如下:

class Solution {
public:
    /**
     *
     * @param root TreeNode类
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > zigzagLevelOrder(TreeNode* root) {
        // write code here
        if(!root) return {};  //空树直接返回
        vector<vector<int> >ans;
        queue<TreeNode*> q;
        q.push(root);
        int level = 0;  //控制填入向量的顺序
        while(!q.empty()){
            int size = q.size(); //队列中含有的节点数量
            vector<int> tmp(size);
            for(int i = 0;i<size;i++){
                TreeNode* node = q.front(); //取出元素
                q.pop();
                if(level%2 == 0) tmp[i] = node->val; //如果level%2==0 ,从向量头开始填入元素
                else tmp[size-i-1] = node->val;     //否则,从尾开始填入元素
                if(node->left) q.push(node->left);  
                if(node->right) q.push(node->right);
        }
           ans.push_back(tmp);
           level++;  // level + 1
        }
        return ans;
    }
};

题解二: 深度优先
题解思路: 进行深度优先遍历,奇偶层节点使用不同插入方案。
图示:
图片说明

复杂度分析:
时间复杂度:O(N)
空间复杂度:O(N) : 最坏情况树退化为链表

class Solution {
public:
    vector<vector<int> >ans;
    vector<vector<int> > zigzagLevelOrder(TreeNode* root) {
        if(!root) return {};  //空树
        dfs(root,0);
        return ans;
    }
    void dfs(TreeNode* root,int level){
        if(!root) return; //递归边界
        if(level >= ans.size()) ans.resize(level+1); //为ans扩容
        if(level%2==0) ans[level].push_back(root->val); //level%2 ==0 ,插入到相应level向量的尾部
        else ans[level].insert(ans[level].begin(), root->val); //level%2 ==1 ,插入到相应level向量的头部
        dfs(root->left,level+1);
        dfs(root->right,level+1);
    }
};
牛客网编程题题解 文章被收录于专栏

本专栏记录在牛客网上AC的每一题,写下题解。 未来2年完成2000编程题的题解。 2021.12.29更新,最进准备毕设,断更了,会尽快做完毕设,继续做这一件事情

全部评论

相关推荐

#简历#先说一说我自己的想法,很多人都很排斥苍穹外卖,认为没什么技术点和含金量,但实际上我觉得恰恰相反,苍穹外卖虽然代码本身并不是你自身能力的证明,但是是作为一个新人学习时很好的跳板和原始框架,在这个框架上进行的改进可以很好的辐射到你自己的个人成果上,并作为你和面试官聊天的筹码大多数人的苍穹外卖只写增删改查,千篇一律,吸引不了面试官,所以这才让大家误以为只要是苍穹外卖就不要写进简历里这种误区,但实际上如果你在原有的层面上进行改进,并作为你的项目亮点和面试官介绍,告诉他你的苍穹外卖和别人的有什么不同,增加了哪些技术难点,这才显得你是完全自己理解了这个项目,并且有自己动手实践项目的能力,而不是就看了个课程就以为自己会了,就当成自己的了,如此一来,这反而成为你的加分项苍穹外卖为什么看的人最多,说明它好啊,如果它不好,为什么看的人还这么多,想清楚这个逻辑,我觉得要做的最重要的事,就是如何在原有框架上进行改进提效,比起听其他人的话重新搞一个项目性价比高得多,而且我亲测项目并没有成为我找到工作的阻碍,我投的大厂一大半都给我面试了,而且很多不止一个部门,退一万步说,当你手头没有其他项目的时候,有苍穹外卖总比什么都没有的好很多,不需要因为苍穹外卖有任何心理负担关于简历的任何部分都欢迎大家提意见,十分感谢大家,祝大家找实习+秋招顺利上岸,offer拿到手软#简历中的项目经历要怎么写##我的上岸简历长这样##最后再改一次简历##简历##简历被挂麻了,求建议#
点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务