面试经典(11)--二叉树层次遍历

6-21 二叉树的层次遍历 (6 分) 本题要求实现给定的二叉树的层次遍历。 函数接口定义: void Levelorder(BiTree T); T是二叉树树根指针,Levelorder函数输出给定二叉树的层次遍历序列,格式为一个空格跟着一个字符。 其中BinTree结构定义如下: typedef char ElemType; typedef struct BiTNode { ElemType data; struct BiTNode *lchild, *rchild; }BiTNode, *BiTree; 裁判测试程序样例 阅读详情

层次遍历二叉树是面试中经常被要求手写的算法,下面来分析遍历过程。

1.先来写一个算法,打印二叉树中某层次的节点(从左到右),其中根节点为第0层。

函数原型:int PrintNodeAtLevel(Node *pRoot,int level),成功返回1,失败返回0。

        10   
      / \   
     5  12   
      / \    
      4    7

打印第1层节点输出:5,12。

思路分析:

肯定要使用先序遍历,考虑使用递归方式,每当递归深入一层level减1,当level=0时输出相应节点。但是这个方法效率比较低,后面我们会改进。

多次强调,递归的退出条件是需要仔细考虑的地方。如果pRoot=NULL或者level<0 这个时候要返回0,如果level=0,要输出节点并返回1。如果上面两点都没有返回,那么就进入递归。

int PrintNodeAtLevel(Node *pRoot,int level)
{
	//返回0不在往更深层递归
	if(pRoot==NULL || level<0)
	{
		return 0;
	}
	//满足条件,输出返回,不在往深层递归
	if(level==0)
	{
		cout<<pRoot->m_chValue<<" ";
		return 1;
	}
	return PrintNodeAtLevel(pRoot->m_pLeft,level-1)+PrintNodeAtLevel(pRoot->m_pRight,level-1);
}
从上面的代码我们可以看出来,假如树的深度是depth,打印level层的节点,如果depth>=level,那么PrintNodeAtLevel返回值肯定大于0,如果depth<level,返回值是0。根据这个规律,我们可以写出如下递归的分层遍历。

void printNode(Node *root)
{
	for(int level=0;;level++)
	{
		if(!PrintNodeAtLevel(root,level))
			break;
		cout<<endl;
	}
}

上述算法每一层的访问都是重新从根节点开始的,知道访问完所有的层次。这样的做法,效率实在不高。下面我们就来讨论非递归的方法。


2.非递归层次遍历

要求:从上到下按层次访问该二叉树,每一层要求访问的顺序从左到右。

void PrintNodeByLevel(Node *pRoot)
{
	if(pRoot==NULL)
	{
		return;
	}
	vector<Node*> vec;
	vec.push_back(pRoot);
	int cur=0,last=1;
	while(cur<vec.size())
	{
		last=vec.size();
		while(cur<last)
		{
			cout<<vec[cur]->m_chValue<<" ";
			if(vec[cur]->m_pLeft)
				vec.push_back(vec[cur]->m_pLeft);
			if(vec[cur]->m_pRight)
				vec.push_back(vec[cur]->m_pRight);
			cur++;
		}
		cout<<endl;
	}
}


编程之美最后说叶劲峰提出一种方法,我看了下比较给力,这个帮助我们更好理解层次遍历。学过数据结构的都学过图的广度遍历,用到了一个队列。二叉树可以使用这种方法,本题关键点是需要再每一层之间输出空行,这就要求我们识别一层的结束。叶劲峰的方法是,在一层结束之后,在队列插入一个结束信号(NULL指针),关键点是我们要想到什么时候插入这个NULL。应该在遇到NULL时,为什么如此?因为我们在队列中遇到NULL,表明本层的遍历已经结束,下层的所有节点已经入队,所以要将NU L入队。

代码:

void PrintNodeByLevel(Node* root) {
    queue<Node*> Q;
    Q.push(root);
    Q.push(0);
    do {
        Node* node = Q.front();
        Q.pop();
        if (node) {
            cout << node->data << " ";
            if (node->pLeft)
                Q.push(node->pLeft);
            if (node->pRight)
                Q.push(node->pRight);
        }
        else if (!Q.empty()) {
            Q.push(0);
            cout << endl;
        }
    } while (!Q.empty());
}


参考:http://www.cnblogs.com/miloyip/archive/2010/05/12/binary_tree_traversal.html

交叉层序遍历二叉树(美团面试题) 来源公众号:算法面试题 说起二叉树遍历,大家并不陌生,先序遍历、中序遍历、后序遍历、层序遍历等等,在面试过程中,二叉树是许多面试官喜欢问的一个考点,大家需要将二叉树的上述遍历牢记于心。   今天,我们将重点讨论二叉树的层序遍历。   基本的层序遍历   二叉树的层序遍历,又叫广度优先遍历,即对二叉树一层一层地进行遍历,把一层的所有结点遍历完成后,再遍历下一层,如下图的遍历结果为:... 阅读详情

相关推荐

二叉树的四种遍历方式以及必备的面试题(附图解)

本文介绍二叉树的四种遍历方式以及必备的面试题。如果我的博客对你有所帮助记得三连支持一下,感谢大家的支持!

铭哥不写bug的博客 730

二叉树的层次遍历

T是二叉树树根指针,Levelorder函数输出给定二叉树的层次遍历序列,格式为一个空格跟着一个字符。

woyvxuetongzai52的博客 607

G2O (General Graph Optimization)入门及简单使用

g2o全称是General Graph Optimization,也就是图优化,我们在做SLAM后端或者更加常见的任何优化问题(曲线拟合)都可以使用G2O进行处理。

晓晨的博客 1万+

LeetCode——第102题:二叉树的层次遍历

题目: 给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层次遍历结果: [ [3], [9,20], [15,7] ] 代码: package leetCode; ...

RBreeze的博客 2000

脑电分析中的频谱特征提取 —— 从理论到实践

本文系统介绍了脑电信号(EEG)频谱特征提取方法及其应用。EEG信号通过频谱分析可分为Delta、Theta、Alpha、Beta和Gamma等具有明确生理意义的频段。文章详细讲解了功率谱密度、频带功率、相对功率、频谱熵等关键特征的计算方法,并提供了Python实现示例,包括模拟数据和真实CHB-MIT癫痫数据集的处理流程。这些频谱特征在脑机接口、情绪识别、疲劳监测和癫痫检测等领域具有重要应用价值。文章强调频谱特征结合时域和非线性特征可提升分析效果,为EEG研究提供了实用指导。

qq_32516809的博客 1441

CMake、Make、MinGw、Clang、Llvm、GCC、MSVC的区别

除开 GCC (GNU 编译器集合) 以外,MinGW 还包含有一些其他的 GNU 程序开发工具;的缩写,MinGw是windows版本的gcc集合。并不仅是一个 C/C++ 编译器,而是一套。是微软开发的VC运行时库,3、Make和CMake是。

m0_37698164的博客 1万+

二叉树的建立及层次遍历(自下而上,自左而右输出)

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

qq_52753078的博客 4226

Zemax实战:手把手教你设计一个40倍、NA0.65的显微物镜(附初始结构文件)

本文详细介绍了使用Zemax设计40倍、NA0.65显微物镜的完整流程,从初始结构搭建到优化验证,涵盖光学设计的关键技巧和实战经验。通过分阶段优化策略和公差分析,帮助工程师快速掌握高倍显微物镜的设计方法,提升光学系统性能。

weixin_42525369的博客 341

七、二叉树(5):二叉树的层序遍历

学会二叉树的层序遍历,可以一口气打完以下十题: 102.二叉树的层序遍历 107.二叉树的层次遍历II 199.二叉树的右视图 637.二叉树的层平均值 429.N叉树的前序遍历 515.在每个树行中找最大值 116.填充每个节点的下一个右侧节点指针 117.填充每个节点的下一个右侧节点指针II 104.二叉树的最大深度 111.二叉树的最小深度 在之前写过这篇文章二叉树:层序遍历登场!(opens new window),可惜当时只打了5个,还不够,再给我一次机会,我打十个! ...

努力努力努力 6134

YOLOv10改进策略【模型轻量化】| 替换骨干网络为MoblieNetV2,含模型详解和完整配置步骤

本文记录的是。采用深度可分离卷积将标准卷积分解为深度卷积和1×1卷积。同时,引入来,避免非线性层导致的性能下降问题。本文将应用到YOLOv10中,借助其高效的结构和特性,在保持一定精度的前提下,显著降低YOLOv10的计算复杂度和内存占用。

Limiiiing的博客 532

wxComboBox类的使用方法及示例代码

其中,parent表示该控件的父窗口,ID_COMBOBOX是该控件的ID,用于在事件处理函数中区分不同的控件,"默认选项"是下拉列表框的默认选项,options是wxArrayString类型的数组,用于存储下拉列表框中的选项,style可以指定wxComboBox的样式。wxComboBox是wxWidgets中的一个常用控件,它可以被用来显示一组在下拉列表框中的选项,并允许用户从中选择一个选项。上述就是wxComboBox类的基本使用方法,使用这个控件可以方便地实现下拉列表框的功能。

学习使你进步。 712

别再翻了,面试二叉树看这 11 个就够了~

写在前边 数据结构与算法: 不知道你有没有这种困惑,虽然刷了很多算法题,当我去面试的时候,面试官让你手写一个算法,可能你对此算法很熟悉,知道实现思路,但是总是不知道该在什么地方写,而且很多边界条件想不全面,一紧张,代码写的乱七八糟。如果遇到没有做过的算法题,思路也不知道从何寻找。面试吃了亏之后,我就慢慢的做出总结,开始分类的把数据结构所有的题型和解题思路每周刷题做出的系统性总结写在了 Github...

小鹿动画学编程 12万+

利用AWVS进行反制

awvs 10.5下载 http://www.32r.com/soft/12986.html

渗透之路,攻防之间皆学问 6653

【leetcode刷题之路】面试经典150题(5)——二叉树+二叉树层次遍历+二叉搜索树

最近有很多企业的春招和暑期实习都陆续开放了,大家要加油哦~

要像蜗牛一样一步一步往上爬! 967

Autosar Configuration(十四)SomeIP之配置SoAd

本文主要介绍SomeIp协议栈中的SoAd在Configurator中的详细配置

king110108的专栏 2600

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

二叉树(从建树、遍历到存储)Java

目录一、结构二、二叉树的遍历1.前序遍历(递归+非递归)2.中序遍历(递归+非递归)3.后序遍历(递归+非递归)4.层次遍历代码功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文......

dabusiGin的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

面试必考02——二叉树的层次遍历

二叉树的层次遍历 import java.util.LinkedList; import java.util.Queue; public class T02LevelOrder { public static class Node{ public int value; public Node left; public Node right...

weixin_43338519的博客 178

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

70 二叉树的层次遍历 II

原题网址:http://www.lintcode.com/zh-cn/problem/binary-tree-level-order-traversal-ii/ 给出一棵二叉树,返回其节点值从底向上的层次序遍历(按从叶节点所在层到根节点所在的层遍历,然后逐层从左往右遍历) 您在真实的面试中是否遇到过这个题? Yes 样例 给出一棵二叉树{3,...

dgc70876的博客 132

【数据结构】二叉树 — 经典OJ面试题剖析!!!

二叉树的基本知识可以查看上一篇博客【数据结构】二叉树 — 图文并茂,带你领略它的魅力!!!二叉树所有题都是围绕着遍历进行的。任何一个二叉树,递归的时候一定是先递归到最左边的。 给你两棵二叉树的根节点p和q编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。给定一个二叉树,判断它是否是高度平衡的二叉树。平衡二叉树:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1 

小黑屋的黑小子的博客 1183

LeetCode 面试经典 150_二叉树层次遍历_二叉树的层平均值(82_637_C++_简单)

LeetCode 面试经典 150_二叉树层次遍历_二叉树的层平均值(82_637_C++_简单) 题目描述: 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。

huayimenghan的博客 388

【转载】别再翻了,面试二叉树看这 11 个就够了

本文转载自博客:https://blog.youkuaiyun.com/qq_36903042/article/details/100798101 -----------------------------------------------------------------------------------------------------------------------------------...

woaitingting1985的博客 225

【算法总结】你真的掌握了二叉树的遍历嘛(1)

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从哪里入手去学习,对此我整理了一些资料如果你熟练掌握以下列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!轮技术面试的几率!这些内容都供大家参考,互相学习。

2301_82101470的博客 837

【Java 数据结构】二叉树的经典面试题 (图解)

本文总结了二叉树的多种经典题型供读者参考,帮助读者掌握二叉树递归遍历的思路

书生-w的博客 1万+

69 二叉树的层次遍历

原题网址:http://www.lintcode.com/problem/binary-tree-level-order-traversal/ 给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) 您在真实的面试中是否遇到过这个题? Yes 样例 给一棵二叉树{3,9,20,#,#,15,7}: 3 / \ 9 20 ...

dgc70876的博客 84
上一篇: 面试经典(12)--射击打靶问题
下一篇: 0-1背包问题
OS技术解密
博客等级 码龄16年 3760粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值