前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >二叉树的层序遍历 --力扣

二叉树的层序遍历 --力扣

作者头像
初阶牛
发布2023-10-14 18:10:18
1480
发布2023-10-14 18:10:18
举报
文章被收录于专栏:C语言基础C语言基础

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻强烈推荐优质专栏: 🍔🍟🌯C++的世界(持续更新中) 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 🍉本篇简介:>:记录力扣题 二叉树的层序遍历

一、二叉树的层序遍历

题目名称: 二叉树的层序遍历 题目链接:传送门 题目难度:中等

题目描述:

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

在这里插入图片描述
在这里插入图片描述

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

解题思路:

  1. 创建一个队列,需要借助队列的性质去访问结点. queue<TreeNode*> q1;
  2. 创建一个二维数组,存储层序遍历的结果.vector<vector<int>> vv1;
  3. 创建一个一维数组,存储每层的数据. vector<int> v1;
  4. 将根节点入队列.

难点:出队列时,如何确定什么时候是一层的结束? 答案: 出队列前,队列的长度,也就是元素个数.

示例:

在这里插入图片描述
在这里插入图片描述

5. 我们定义一个count变量,用于记录出队列前,队列的长度. 6. 以count为条件,进行出队列,将这一层的数据插入进 vector<int> v1; 7. 一层数据获取完毕后,将这一层数据存入二维数组vv1; 8. 返回这个二维数组即可.

代码实现:

代码语言:javascript
复制
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        queue<TreeNode*> q1;        //定义一个存树结点的队列
        vector<vector<int>> vv1;  //定义一个二维数组
        
        if(root==nullptr)   //空树直接返回
        {
            return vv1;
        }
        q1.push(root);  //根节点入队列

        while(!q1.empty())
        {
            int count=q1.size();    //每一层的数量
            vector<int> v1;     //用于存放每一层的结点数据
            for(int i=0;i<count;i++)
            {
                TreeNode* node=q1.front();
                v1.push_back(node->val);
                q1.pop();
                
                //孩子入栈
                if(node->left)q1.push(node->left);
                if(node->right)q1.push(node->right);
            }
            vv1.push_back(v1);      //将这一层的数据插入
        }
        return vv1;
    }
};

二、二叉树的层序遍历 II

题目描述

题目名称: 二叉树的层序遍历 II 题目链接:传送门 题目难度:中等

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

在这里插入图片描述
在这里插入图片描述

示例1:

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

示例 2:

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

示例 3:

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

解题思路:

如何从下往上打印呢?还是先从根节点开始入队列吗? 当你还在犹豫、考虑如何下手的时候,牛牛已经在开心的做一名cv工程师了!

只需要在上一题的基础上,将二维数组逆置一下,每一行即可.

只需一行代码,解决问题,美滋滋!

代码语言:javascript
复制
reverse(vv1.begin(),vv1.end());

代码实现:

代码语言:javascript
复制
class Solution {
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
        queue<TreeNode*> q1;        //定义一个存树结点的队列
        vector<vector<int>> vv1;  //定义一个二维数组
        
        if(root==nullptr)   //空树直接返回
        {
            return vv1;
        }
        q1.push(root);  //根节点入队列

        while(!q1.empty())
        {
            int count=q1.size();    //每一层的数量
            vector<int> v1;     //用于存放每一层的结点数据
            for(int i=0;i<count;i++)
            {
                TreeNode* node=q1.front();
                v1.push_back(node->val);
                q1.pop();
                
                //孩子入栈
                if(node->left)q1.push(node->left);
                if(node->right)q1.push(node->right);
            }
            vv1.push_back(v1);      //将这一层的数据插入
        }
        reverse(vv1.begin(),vv1.end());		//只需一步
        return vv1;
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、二叉树的层序遍历
    • 题目描述:
      • 解题思路:
        • 代码实现:
        • 二、二叉树的层序遍历 II
          • 题目描述
            • 解题思路:
              • 代码实现:
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档