首页 > 编程语言 >【408DS算法题】029基础-二叉树的层次遍历

【408DS算法题】029基础-二叉树的层次遍历

时间:2024-08-29 23:51:20浏览次数:7  
标签:遍历 cur 408DS 队列 029 出队 二叉树 push root

Index

题目本文稍后补全,以下内容来自:https://blog.csdn.net/weixin_60702024/article/details/141615340

给定二叉树的根节点root,写出函数实现对二叉树的层次遍历。


分析实现

二叉树的层次遍历的访问顺序,可以非常直观地看出。但二叉树本身的存储结构并不能直接实现层次遍历,常见的遍历方式是借助队列存储当前层的所有结点,思路如下:

  1. 将根节点root加入队列q
  2. 对于队列中每个结点cur,访问队首结点cur,将cur出队,再将cur的子节点加入q
  3. 重复2直到q为空

具体实现如下:

#include <queue>

// 队列实现层次遍历
void levelOrder(BTNode* root) {
    if (root == NULL) 
		return;
    queue<BTNode*> q;
    q.push(root);
    
    while (!q.empty()) {
        BTNode* cur = q.front();
        q.pop();
        // 访问当前结点 e.g: cout<<cur->val<<' ';
        visit(cur);		
        if (cur->left != NULL)
            q.push(cur->left);
        if (cur->right != NULL)
            q.push(cur->right);
    }
}

这是常见的层次遍历写法,在此基础之上,还可以进行一点改进使得遍历过程更加灵活:

  1. 将根节点root加入队列q
  2. 记录当前q的元素个数n,执行n次 “访问cur,出队cur,加入cur子节点”
  3. 重复2直到q为空

此处最大的改动在于(2),改动前每一步(2)只会执行1次 “访问cur,出队cur,加入cur子节点”,改动后每一步(2)会直接执行n次 “访问cur,出队cur,加入cur子节点” ,这样每次执行(2)都固定对一层的结点进行操作并出队。

通过这种改进,可以很简单地分清每一层结点,使用实例如下:

// 分层输出的层次遍历
void levelOrder(BTNode* root) {
    if (root == NULL) 
        return;
    queue<BTNode*> q;
    q.push(root);
	// 定义变量记录当前层次
    int layer = 1;
    while (!q.empty()) {
        cout << "当前访问的层次为:" << layer << endl;
        layer++;
        // 定义变量记录当前层次结点个数
        int n = q.size();
        while (n--) {
            BTNode* cur = q.front();
            q.pop();
            cout << cur->val << " ";
            if (cur->left != NULL)
                q.push(cur->left);
            if (cur->right != NULL)
                q.push(cur->right);
        }
        cout << endl; // 换行以区分不同层次的节点
    }
}

总结

以上就是常用的使用队列实现层次遍历的实现,已经十分常用的小改进。

代码中使用了c++的<queue>头文件,queue的常用操作如下:

queue<int> q;	// 定义一个存储int型元素的队列q

q.empty();	// return bool, 若q为空,返回true
q.size();	// return size_t, 返回q中元素个数,不会溢出的情况下经常存储于int变量中

q.push(x);	// 将元素x添加到队列尾部
q.pop();	// 将队首元素出队

q.front();	// 返回队首元素
q.back();	// 返回队尾元素

标签:遍历,cur,408DS,队列,029,出队,二叉树,push,root
From: https://blog.csdn.net/weixin_60702024/article/details/141691161

相关文章

  • 25版王道数据结构课后习题详细分析 第五章 树与二叉树 5.4 树、森林
    一、单项选择题————————————————————————————————————————解析:正确答案:D————————————————————————————————————————解析:森林与二叉树具有对应关系,因此,我们存储森林时应先将森林转换......
  • 【408DS算法题】028基础-查找二叉树的最大值结点
    Index题目分析实现总结题目给定二叉树的根节点,找到二叉树中结点值最大的结点。分析实现对于查找二叉树中的最大值结点,在二叉树的遍历(DFS、层次遍历)的基础上进行修改可以轻松地达成这一目的。本文中选用的是相对直观的后序遍历,具体实现如下:BTNode*findMax(BTN......
  • 信息学奥赛初赛天天练-77-NOIP2015普及组-基础题2-二进制、连通图、最小生成树、链表
    NOIP2015普及组基础题24在计算机内部用来传送、存贮、加工处理的数据或指令都是以()形式进行的A二进制码B八进制码C十进制码D智能拼音码5下列说法正确的是()ACPU的主要任务是执行数据运算和程序控制B存储器具有记忆能力,其中信息任何时候都不会......
  • 二叉树的最近公共祖先
    ​​......
  • day13: 第六章 二叉树part01 |二叉树的前序遍历,后序遍历,中序遍历,(递归。层序(广度)跟
    二叉树递归三部曲:1.确定递归函数的参数和返回值。2.确定终止条件3.确定单层递归的逻辑144.二叉树的前序遍历:中左右,递归:classSolution{publicList<Integer>preorderTraversal(TreeNoderoot){List<Integer>res=newArrayList<Integer>();p......
  • 二叉树的层序遍历 C++
    给你二叉树的根节点 root ,返回其节点值的 层序遍历 。(即逐层地,从左到右访问所有节点)。示例1:输入:root=[3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]示例2:输入:root=[1]输出:[[1]]示例3:输入:root=[]输出:[]classSolution{public:vector<vect......
  • 根据二叉树创建字符串 C++
    给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。空节点使用一对空括号对 "()" 表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。示例1:输入:root=[1,2,3,4]输出:"1......
  • 代码随想录算法训练营第十九天| 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数
    530.二叉搜索树的最小绝对差1.这题的关键在于二叉搜索树的中序遍历就是有序序列。classSolution{private:vector<int>vec;voidtraversal(TreeNode*root){if(root==NULL)return;//中序遍历树,得到有序序列traversal(root->le......
  • 【数据结构】二叉树的顺序结构,详细介绍堆以及堆的实现,堆排序
    目录1.二叉树的顺序结构2.堆的概念及结构3.堆的实现3.1堆的结构3.2堆的初始化3.3堆的插入 3.4堆的删除3.5获取堆顶数据3.6堆的判空3.7堆的数据个数3.8堆的销毁4.堆的应用4.1堆排序4.1.1向下调整建堆的时间复杂度 4.1.2向上调整建堆的时间复杂......
  • 【Java】/* 二叉树 - 底层实现*/
    一、前序遍历-递归/*1.前序遍历-递归*/publicvoidpreOrder(TreeNoderoot){//1.如果根节点为nullif(root==null){return;}//本意:打印树的根,左,右节点//2.打印根节点的值System.out......