首页 > 其他分享 >【102. 二叉树的层序遍历 中等】

【102. 二叉树的层序遍历 中等】

时间:2024-12-22 18:02:32浏览次数:7  
标签:遍历 层序 vector 二叉树 102 root 节点 result

题目:

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

示例 1:
在这里插入图片描述

输入: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. 方法1:借助队列queue实现迭代遍历
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        queue<TreeNode*>  que1;
        if(root != NULL) que1.push(root);
        vector<vector<int>> result;

        while(!que1.empty()){
            int size = que1.size();
            vector<int> vec;
            // 这里一定要使用固定大小size,不要使用que.size(),因为que.size是不断变化的
            while(size--){	//	一个循环对应一层深度
                TreeNode* node = que1.front();
                que1.pop();
                vec.push_back(node->val);    //  将该层的节点存入该层vector中
                if(node->left) que1.push(node->left);   //  将该层节点的左子节点存入queue中,下次循环取出存入vector
                if(node->right) que1.push(node->right); //  将该层节点的右子节点存入queue中,下次循环取出存入vector
            }
            result.push_back(vec);  //将该层vector存储到result中
        }
        return result;
    }
};
  1. 方法2:递归遍历。递归算法的三要素参考【递归法:144.二叉树的前序遍历 145.二叉树的后序遍历 94.二叉树的中序遍历 简单】
class Solution {
public:
    void order(TreeNode* cur, vector<vector<int>>& result, int depth){
        if(cur == NULL) return;
        //  确保在向 result 添加节点之前,每个深度都有一个对应的向量来存储该层级的节点值,从而避免越界访问和未定义行为。
        if(result.size() == depth) result.push_back(vector<int> ());
        result[depth].push_back(cur->val);
        order(cur->left, result, depth + 1);
        order(cur->right, result, depth + 1);
    }
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> result;
        int depth = 0;
        order(root, result, depth);
        return result;
    }
};

总结:

这份代码也可以作为二叉树层序遍历的模板。


参考:

代码随想录

标签:遍历,层序,vector,二叉树,102,root,节点,result
From: https://blog.csdn.net/yuan_2001_/article/details/144648614

相关文章

  • 101.对称二叉树
    varisSymmetric=function(root){if(!root)returntrue;returnisMirror(root.left,root.right);};functionisMirror(left,right){if(!left&&!right)returntrue;if(!left||!right)returnfalse;if(left.val!==right.val)......
  • 12.16 二叉树的题目用acm模式 leetcode
    任务有leetcode1.将所有二叉树的题目用acm模式进行补充(完成了)github上面的所有二叉树ACM答案,模板https://github.com/PUNKDONG/leetcode/tree/master/src/treenodepackagetreenode;importjava.util.*;publicclasstreecode0_template{staticclassTreeNo......
  • 二叉树的代码实现
    main.c:tree.c:创建根,前序遍历,中序遍历,后序遍历,层序遍历,树的广度,树的深度,释放tree.h:queue.h:队列的代码实现:队列的实现-CSDN博客......
  • 数据结构-树(二叉树)
    在了解树具体的代码实现之前,先了解一下树的基础知识:根节点:第一个结点;叶子节点(终端节点):之后再没有其它结点的结点;分支节点(非终端节点):之后还有其它结点的结点;深度:即树的层数;(广)度:最大的节点的度;节点的度:节点的子节点个数这里主要介绍二叉树,即度为二,区分左右子节点的树结构。......
  • 【LC】104. 二叉树的最大深度
    题目描述:给定一个二叉树 root ,返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。示例1:输入:root=[3,9,20,null,null,15,7]输出:3示例2:输入:root=[1,null,2]输出:2提示:树中节点的数量在 [0,104] 区间内。-100<=No......
  • 1102 HAOI2008, 硬币购物
    //1102HAOI2008,硬币购物.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*http://oj.daimayuan.top/course/22/problem/1180共有4种硬币。面值分别为c1,c2,c3,c4。某人去商店买东西,去了n次,对于每次购买,他带了di枚i种硬币,想购买s的价值的东西。......
  • Debian安装RTL8101E_RTL8102E_RTL8103E_RTL8105E
    0.适用范围由于Debian默认采用r8169驱动,不是适用该型号驱动的网卡需要另外打驱动。而且r810x系列的网卡由于年代久远无法采用安装dkms额外软件包的方法,只能从官方网下载并编译。r8101驱动适用于RTL8101E/RTL8102E/RTL8103E/RTL8105E/RTL8106E/RTL8107E1.下载驱动进real......
  • 二叉树中和为某一值的路径 剑指offer
    题目描述        输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。        二叉树节点的定义如下:题目分析                分析完前面具体的例子......
  • 二叉树的右视图
    二叉树的右视图描述给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入:[1,2,3,null,5,null,4]输出:[1,3,4]解释:1<---/\23<---\\54<---代码1(错误)......
  • 之字形打印二叉树 剑指offer
    题目描述       请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。例如,按之字形顺序打印下图二叉树的结果为:题目分析       按之字形顺序打印二叉树需要......