题目

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例 1:

img

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目在范围 [0, 2000]
  • -1000 <= Node.val <= 1000

解答

  1. 使用队列辅助层序遍历

注意看这个题的输入与输出,输出的动态数组的元素是元素为整型的数组,比如[[3],[9,20],[15,7]].因此如果只定义一个队列辅助遍历,无法清晰的区分每层的元素应该插入到哪个数组中,比如如果只使用一个队列进行层次遍历,得到的结果只能是[3,9,20,15,7],无法从这个结果中得知清晰的二叉树层次结构,所以在这里定义两个队列,首先向一个队列中塞入元素,接着对队首元素进行pop并且将队首元素的左右子树节点分别塞入另一队列中,再将结果数组并入result数组中,再将另一个队列进行同样的遍历操作,具体的C++实现代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        // 定义两个队列 分别为q和another_q 用于层次遍历
        queue<TreeNode*> q;
        queue<TreeNode*> another_q;
        // 定义结果数组 其元素为元素为int类型的数组
        vector<vector<int>> result;    
        // 若根节点非空 则将根节点push进队列q中 
        if (root != nullptr) {
            q.push(root);
        }
        // 当q或者another_q队列非空时 进行遍历操作
        while (!q.empty()|| !another_q.empty()) {
            // 定义元素为int的临时数组 用于存储每一层的元素
            vector<int> temp_vector;
            // 当队列q非空时 将队列q的元素逐个出队
            while (!q.empty()) {
                TreeNode* temp_node = q.front();
                // 向临时数组中塞入节点的值
                temp_vector.push_back(temp_node->val);
                // 塞入之后 将对应元素出队
                q.pop();
                // 判断出队的元素是否有左右节点并将其塞入另一个队列中
                if (temp_node->left != nullptr) {
                    another_q.push(temp_node->left);
                }
                if (temp_node->right != nullptr) {
                    another_q.push(temp_node->right);
                }
            }
            // 若临时数组非空 则将其插入结果数组中 并清空临时数组
            if (temp_vector.size() != 0) {
                result.push_back(temp_vector);
                temp_vector.clear();
            }
            // 当另一个队列another_q非空时 将队列another_q的元素逐个出队
            while (!another_q.empty()) {
                TreeNode* temp_node = another_q.front();
                // 向临时数组中塞入节点的值
                temp_vector.push_back(temp_node->val);
                // 塞入之后 将对应元素出队
                another_q.pop();
                // 判断出队的元素是否有左右节点并将其塞入另一个队列中
                if (temp_node->left != nullptr) {
                    q.push(temp_node->left);
                }
                if (temp_node->right != nullptr) {
                    q.push(temp_node->right);
                }
            }
            // 若临时数组非空 则将其插入结果数组中 并清空临时数组
            if (temp_vector.size() != 0) {
                result.push_back(temp_vector);
                temp_vector.clear();
            }
        }
        // 返回结果数组
        return result;
    }
};