• leetcode: 二叉树的层序遍历


    102. 二叉树的层序遍历

    难度中等1411

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

    示例 1:

    img
    输入:root = [3,9,20,null,null,15,7]
    输出:[[3],[9,20],[15,7]]
    
    • 1
    • 2

    示例 2:

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

    示例 3:

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

    提示:

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

    思路:

    说到层序遍历,就想到广度优先遍历以及队列hhh!

    但是这道题不太一样的是,它要求要按一个数组的形式返回,也就是说把每一层的元素放到一个一维数组,再把这些一维数组放到一个二维数组中去,所以我们得控制它遍历每层的元素个数,另外,还可以借助vector来存储(睁眼说瞎话,题目要求返回 “二维vector” 哈哈哈)。

    步骤:

    1. 创建一个 “二维vector” vv 和 一个队列 q,并判断一下 root 是否为空,若不为空则将其入队。
    2. 通过 n 来统计每次 队列q 中的个数,也就是每层元素的个数,然后进行 n 次循环。
    3. 在子循环中,每次将该层元素放到新的 “一维vector” v 中去,然后判断该节点是否有左右孩子,有的话就将其入队列。
    4. 接着将 v 尾插到 vv 中去,一直循环,直到队列q 为空则结束。
    5. 最后返回 vv
    class Solution {
    public:
        vector<vector<int>> levelOrder(TreeNode* root) {
            vector<vector<int>> vv;
            queue<TreeNode*> q;
    
            //防止空指针
            if(root != nullptr)
            {
                q.push(root);
            }
            
            while(!q.empty())
            {
                int n = q.size();
                vector<int> v;//用一个一维vector来存该层的数值
    
                for(size_t i = 0; i < n; i++)
                {
                    TreeNode* tmp = q.front();
                    q.pop();
    
                    v.push_back(tmp->val);
    
                    if(tmp->left)
                    {
                        q.push(tmp->left);
                    }
                    if(tmp->right)
                    {
                        q.push(tmp->right);
                    }
    
                }
                //记得把该层的一维vector尾插到vv中去
                vv.push_back(v);
            }
            return vv;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    107. 二叉树的层序遍历 II

    难度中等602

    给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

    示例 1:

    img
    输入:root = [3,9,20,null,null,15,7]
    输出:[[15,7],[9,20],[3]]
    
    • 1
    • 2

    示例 2:

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

    示例 3:

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

    提示:

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

    思路:

    有了上面第一题,这道题就很简单了!

    刚开始想,是不是觉得很难?但是仔细一想,其实就是将我们第一题最后的 vv 逆序一下,就变成了自底向上的顺序了!

    我们可以借助函数 reverse 替我们完成!

    class Solution {
    public:
        vector<vector<int>> levelOrderBottom(TreeNode* root) {
            vector<vector<int>> vv;
            queue<TreeNode*> q;
            if(root != nullptr)
                q.push(root);
            while(!q.empty())
            {
                int n = q.size();
                vector<int> v;
                for(size_t i = 0; i < n; ++i)
                {
                    TreeNode* tmp = q.front();
                    q.pop();
    
                    v.push_back(tmp->val);
    
                    if(tmp->left)
                        q.push(tmp->left);
                    if(tmp->right)
                        q.push(tmp->right);
                }
                vv.push_back(v);
            }
            
            //上面的操作都是一致的,只需要最后逆序一下即可!
            reverse(vv.begin(), vv.end());
            return vv;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
  • 相关阅读:
    【Python爬虫实战】 不生产小说,只做网站的搬运工,太牛逼了~(附源码)
    mysql操作
    MVC自动配置原理
    vue踩的坑:属性报undefined错误问题汇总
    课程表系列
    知识蒸馏(Knowledge Distillation)
    工程伦理--14.1 中国工程“走出去”的现实挑战
    【过程记录】通过ssh上传Github仓库
    Netty基础入门和基本使用
    使用C语言+USRP B210从零开始实现无线通信(3) DASK差分幅度键控调制
  • 原文地址:https://blog.csdn.net/lirendada/article/details/126175534