算法进阶——求二叉树的层序遍历

题目


给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)。

例如:
给定的二叉树是{3,9,20,#,#,15,7},

该二叉树层序遍历的结果是
[
[3],
[9,20],
[15,7]
]

提示:
0 <= 二叉树的结点数 <= 1500

示例1

输入:
{1,2}
返回值:
[[1],[2]]

示例2

输入:
{1,2,3,4,#,#,5}
返回值:
[[1],[2,3],[4,5]]

思路


利用辅助队列,通过bfs(广度优先)算法遍历二叉树,按层次顺序记录节点。

我的解答代码还有一个可以优化的点是,每层的节点数其实就是当前辅助队列的大小,这样其实不需要next_level_num和to_be_handle这2个辅助变量。

解答代码


/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
#include <queue>
class Solution {
public:
    /**
     * @param root TreeNode类 
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > levelOrder(TreeNode* root) {
        // write code here
        vector<vector<int> > res;
        if (root == nullptr) {
            return res;
        }
        // bfs
        queue<TreeNode*> nodes;
        nodes.push(root);
        int next_level_num = 0;// 下一层的节点数
        int to_be_handle = 1;// 本层还未处理的节点数
        vector<int> cur;// 本层的遍历结果

        while (!nodes.empty()) {
            auto node = nodes.front();

            if (node->left != nullptr) {
                nodes.push(node->left);
                ++next_level_num;
            }
            if (node->right != nullptr) {
                nodes.push(node->right);
                ++next_level_num;
            }

            cur.push_back(node->val);

            nodes.pop();
            --to_be_handle;

            if (to_be_handle == 0) {
                // 本层处理完了
                res.push_back(cur);
                cur.clear();
                to_be_handle = next_level_num;
                next_level_num = 0;
            }
        }

        return res;
    }
};