首页 > 其他分享 >二叉树的层次遍历(广度优先)

二叉树的层次遍历(广度优先)

时间:2025-01-22 21:59:10浏览次数:3  
标签:node 遍历 TreeNode right que 二叉树 广度 节点 left

所谓层次遍历,就是按层次从左往右遍历二叉树。但是一个节点的左子树和右子树之间是没有直接联系方式的。换句话说,当我们遍历了一个节点的左子树的根节点后,无法直接遍历该节点的右子树的根节点。这里我们可以借助一个数据结构,先按一定顺序将节点存放起来,再从该数据结构取出数据,最后得到按层次遍历访问节点的结果。这个数据结构就是队列。直接讲可能有些抽象,我将在代码注释中结合代码详细讲解是如何操作的。

代码如下:

/**
 * 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) {
        vector<vector<int>> res;
        //存放节点的队列
        queue<TreeNode*> que;
        //最开始队列为空,先将根节点存入队列
        if(root != NULL){
              que.push(root);
        }
        TreeNode* node;
        int size;
        //队列不为空才可以弹出数据
        while(!que.empty()){
            vector<int> vec;
            //size用来控制每次循环弹出节点的数量,保证一次循环弹出一层的节点数量
            size = que.size();
             //循环弹出节点
              while(size--){
//用一个工作指针一直指向队列的第一个节点,确保在每次弹出第一个节点的同时,将该节点的左右孩子都存入队列(这个操作确保了节点在队列中的存放顺序符合层次遍历)
                node = que.front();
                //将节点存放的数值放入一维数组
                vec.push_back(node -> val);
                que.pop();
                //将左右孩子存入队列
                if(node -> left != NULL) que.push(node -> left);
                if(node -> right != NULL) que.push(node -> right);
              }
              //每结束一个循环,即遍历完一层,最后要放入二维数组中
              res.push_back(vec);
        }
        return res;
    }
};

标签:node,遍历,TreeNode,right,que,二叉树,广度,节点,left
From: https://blog.csdn.net/yaodec/article/details/145300903

相关文章

  • 翻转二叉树(力扣226)
    写这道题之前需要熟悉二叉树的遍历,可以看我的这两篇文章:二叉树的遍历(深度遍历)-CSDN博客,二叉树的层次遍历(广度优先)-CSDN博客所谓翻转二叉树,就是将每一个节点的左孩子和右孩子交换(注意这里指的是指针交换,而不是交换节点的数值)。无非就是在遍历二叉树的基础上调用一下swap......
  • 数据结构-二叉树
     树的相关概念:1、节点的度:树中一个节点的孩子个数称为该节点的度,所有节点的度的最大值是树的度2、分支节点:度大于0的节点称为分支节点3、叶子结点:度为0的节点称为叶子结点4、节点的层次(深度):从上往下数,根节点为1层,依次往下加15、树的高度(深度):树中节点的最大层次6、树......
  • 【刷题实录之二叉树】leecode429. N 叉树的层序遍历(层序遍历)
    题目:给定一个N叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。树的序列化输入是用层序遍历,每组子节点都由null值分隔。题解:本体是层序遍历的变形,只需要将“左右孩子入队”变成“所有孩子入队”即可,需对结点数据结构有深入把握。代码(C++):classSolution{public:......
  • web攻击-外部路径遍历攻击(External Path Traversal Attack)
    外部路径遍历攻击(ExternalPathTraversalAttack),也被称为目录遍历攻击,是一种网络攻击技术,攻击者试图通过篡改应用程序或系统的路径参数,访问本来应该受限的文件或目录。 这种攻击通常发生在Web应用程序中,当应用程序处理用户输入的文件路径时,如果没有对路径进行适当的验证和过......
  • 2110 加分二叉树
    描述设一个 n 个节点的二叉树 tree 的中序遍历为 (1,2,3,⋯,n),其中数字 1,2,3,⋯,n 为节点编号。每个节点都有一个分数(均为正整数),记第 i 个节点的分数为 di​,tree 及它的每个子树都有一个加分,任一棵子树 subtree(也包含 tree 本身)的加分计算方法如下:记 subtree......
  • 【9.1】树结构-从先序遍历还原二叉树
    一、题目        我们从二叉树的根节点root 开始进行深度优先搜索。        在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为D,则其直接子节点的深度为D+1。根节点的深度为0)。       ......
  • 代码随想录:二叉树的公共祖先
    这道题是真巧妙,巧妙有两点不用区分两个目标节点,只要命中了,就往上代码可以处理一个节点本来就是另一个节点祖先的情况/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode(int......
  • 大一计算机的自学总结:二叉树三种序的非递归遍历
    前言二叉树的递归遍历在我上一篇“二叉树及其三种序的递归遍历”里有。其中用到的“BinaryTree”也在链接文章的“二叉树的创建”里。大一计算机的自学总结:二叉树及其三种序的递归遍历而非递归遍历是借助栈的特性,会更难更复杂。TvT......一、先序遍历#include<bits/stdc++.......
  • 【二叉树】已知前序中序、中序后序遍历构造二叉树
    105.从前序与中序遍历序列构造二叉树-力扣(LeetCode)/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),right(nullptr){}*TreeNode(intx......
  • 如何遍历整个列表
    想对大家说的话:大家好呀,我是耶耶在这里,我会将Python代码像拆解精密玩具一样,一步步剖析,确保每一步的来龙去脉都清晰可见。我会详细解释为什么选择特定的关键字和结构,通过对比不同类型的代码片段,让你不仅知其然,更知其所以然!!!拜托大家给我点一个关注!让我们一起进步吧!!!上期本期......