ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

《从头再来》剑指offer.32III 从上到下打印二叉树

2021-06-07 19:03:58  阅读:194  来源: 互联网

标签:node 从头再来 level deq back 二叉树 push TreeNode offer.32


请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

由于需要对偶数层的节点进行反向输出,所以我们想到借助双端队列来完成反向的操作。其他的操作和前两题没什么区别,主要的区别就是奇数层和偶数层对于双端队列来说入队的位置不同,不只入队的顺序不同,并且左右子节点的入队顺序也不同。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> result;
        if(root == nullptr) return result;

        //借助双端队列
        deque<TreeNode*>    deq;
        deq.push_back(root);//先将根结点加入队列
        int level_number = 2;//从第二层开始

        while(!deq.empty()){
            int count = deq.size();
            vector<int> level;
            while(count != 0){
                if(level_number%2 == 0){
                    //偶数层,从后取上层节点,然后将本层节点从前面压入(偶数层先压左节点)
                    TreeNode* node = deq.back();
                    level.push_back(node->val);
                    deq.pop_back();//从后取从后出队列
                    count--;
                    if(node->left != nullptr)   deq.push_front(node->left);
                    if(node->right != nullptr)  deq.push_front(node->right);
                }
                if(level_number%2 == 1){
                    //奇数层,从前取上层节点,然后将本层节点从后面压入(奇数层先压右节点)
                    TreeNode* node = deq.front();
                    level.push_back(node->val);
                    deq.pop_front();//从前取从前出队列
                    count--;
                    if(node->right != nullptr)  deq.push_back(node->right);
                    if(node->left != nullptr)   deq.push_back(node->left);
                }
            }
            level_number++;
            result.push_back(level);
        }
        return result;
    }
};

多画图理解一下偶数层和奇数层的入队方式。

《从头再来》

 

标签:node,从头再来,level,deq,back,二叉树,push,TreeNode,offer.32
来源: https://www.cnblogs.com/azie420/p/14860090.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有