2020-10-02 [牛客]二叉树的之字形层序遍历

题目描述

给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
例如:
给定的二叉树是{3,9,20,#,#,15,7},
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tXhRAmnS-1601649128774)(assets/999991351_1596788654427_630E55F47DBAFBF72C88E265929E43F7.png)]
该二叉树之字形层序遍历的结果是

[

[3],

[20,9],

[15,7]

]

示例1

输入

复制

{1,#,2}

输出

复制

[[1],[2]]

C++ BFS 改造,加一个翻转

因为是之字形,所以偶数行flag=1是从左到右遍历,奇数行是flag=0,逆序遍历。

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */

class Solution {
     
public:
    /**
     * 
     * @param root TreeNode类 
     * @return int整型vector>
     */
    vector<vector<int> > zigzagLevelOrder(TreeNode* root) {
     
        vector<vector<int> >res;
        queue<TreeNode*> que;
        // 一定不要忘了非空判断
        if(root==nullptr) return res;
        que.push(root);
        int flag = 1;
        while(!que.empty()){
     
            int size = que.size();
            vector<int> temp;
            for(int i=0;i<size;i++){
     
                TreeNode* node = que.front();
                que.pop();
                if(node->left) que.push(node->left);
                if(node->right) que.push(node->right);
                // 关键点在这里,加一个是奇数行还是偶数行即可
                if(flag){
     
                    temp.push_back(node->val);
                }else{
     
                	// 每次从头部插入
                    temp.insert(temp.begin(), node->val);
                }
            }
            flag = 1-flag;
            res.push_back(temp);
        }
        return res;
    }
};

你可能感兴趣的:(algorithm,二叉树,BFS,层序遍历)