其他分享
首页 > 其他分享> > 《从头再来》剑指offer.32III 从上到下打印二叉树

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

作者:互联网

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

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

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