二叉树层序遍历

1题目

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

示例 1:

二叉树层序遍历_第1张图片

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

输出:[[3],[9,20],[15,7]]

示例 2:

输入:root = [1]

输出:[[1]]

示例 3:

输入:root = []

输出:[]

2链接

题目:102. 二叉树的层序遍历 - 力扣(Leetcode)

视频:讲透二叉树的层序遍历 | 广度优先搜索 | LeetCode:102.二叉树的层序遍历_哔哩哔哩_bilibili

3解题思路

层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。

需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。

而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。

使用队列实现二叉树广度优先遍历,动画如下:

总体来说就是:弹出的节点左右孩子不为空就持续加进来,弹出完第n层节点那么第n+1层节点也就全加进来了

4代码

/**
 * 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> levelOrder(TreeNode* root) {
        queue que;//用于动态存储二叉树元素
        if (root != NULL) que.push(root);
        vector> result;//用于存储每层元素的集合体,二维数组
        while (!que.empty()) {
            int size = que.size();//size指的是每层元素的数量,需要依次弹出完
            vector vec;//用于临时储存每层元素的内容
            //要使用固定大小size,不要使用que.size(),因为que.size是不断变化的
            for (int i = 0; i < size; i++) {
                TreeNode* node = que.front();
                que.pop();
                vec.push_back(node->val);
                //存在左子树,把该节点的左子树放入队列
                if (node->left) que.push(node->left);
                //存在右子树,把该节点的右子树放入队列
                if (node->right) que.push(node->right);
            }
            result.push_back(vec);//每层弹出都记录一次
        }
        return result;
    }
};

你可能感兴趣的:(LeetCode练习,leetcode)