二叉树的层序遍历详细讲解(附完整C++程序)
来源:互联网 发布:如东知品服饰有限公司 编辑:程序博客网 时间:2024/06/05 11:23
1 说明
二叉树的层序遍历是面试经常会被考察的知识点,甚至要求当场写出实现过程。笔者先后被腾讯和滴滴面试官问过这个问题,腾讯面试官是让称述整个实现过程,本人自信满满的说出来了,所以也没有对具体实现太上心。等到滴滴面试的时候,让我详细写出实现,真正上手之后发现原理懂,但是如果没有朝一个正确的方向努力原来还是蛮棘手的,等下我再说本人卡壳在哪个地方了。
2 原理介绍
层序遍历所要解决的问题很好理解,就是按二叉树从上到下,从左到右依次打印每个节点中存储的数据。如下图:
按层序遍历的原则,打印顺序依次应该是:A->B->C->D->E->F->G。
看完是不是感触非常深,这不就是队列数据结构最拿手的绝活吗,FIFO,先进先出!我从上到下,从左到右依次将每个数放入到队列中,然后按顺序依次打印就是想要的结果。
实现方案的确很好想到,但是具体实现容易卡壳在你是将什么放入队列中。本人当时面试仅存储每个数据到队列中,造成访问完A,然后将B和C(左右孩子)放入队列,并且删除最前面一个数(当前也就是A),这样B就轮到了最前方。想着是依次下去,但是如果队列仅存数据就会发现,不知道后面如何顺序访问下去,也不知道二叉树何时停止。所以正确的方式是队列中每个节点应该是存储一个二叉树的指针,这样才能依次依靠指针left和right访问下去。
原理还是挺简单的,笔者认为除了上面需要主要其他都挺好理解的,下面直接看C++程序以及程序中注解吧。
3 C++实现程序
#include<cstdio>#include<queue>using namespace std;/*二叉树结构体,并且构建了有参构造函数*/struct BinaryTree{ int vec; BinaryTree* left; BinaryTree* right; BinaryTree(int data) :vec(data), left(nullptr), right(nullptr){ }};/*队列实现层序遍历*/void printTree(BinaryTree* arr[]){ queue<BinaryTree*> rel; //定义一个队列,数据类型是二叉树指针,不要仅是int!!不然无法遍历 rel.push(arr[0]); while (!rel.empty()) { BinaryTree* front = rel.front(); printf("%d\n", front->vec); rel.pop(); //删除最前面的节点 if (front->left != nullptr) //判断最前面的左节点是否为空,不是则放入队列 rel.push(front->left); if (front->right != nullptr)//判断最前面的右节点是否为空,不是则放入队列 rel.push(front->right); }}int main(){ /*构建二叉树*/ BinaryTree* s_arr[6]; s_arr[0] = new BinaryTree(0); s_arr[1] = new BinaryTree(1); s_arr[2] = new BinaryTree(2); s_arr[3] = new BinaryTree(3); s_arr[4] = new BinaryTree(4); s_arr[5] = new BinaryTree(5); s_arr[0]->left = s_arr[1]; // 0 s_arr[0]->right = s_arr[2]; // 1 2 s_arr[1]->left = s_arr[3]; // 3 5 s_arr[3]->left = s_arr[4]; //4 s_arr[2]->right = s_arr[5]; //所以层序遍历的结果为:0 1 2 3 5 4 /*层次遍历打印所有节点*/ printTree(s_arr); /*释放所有空间*/ for (int i = 0; i < 6; i++) delete s_arr[i]; return 0;}
个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!
转载请注明出处:http://blog.csdn.net/FX677588/article/details/74276513
阅读全文
4 0
- 二叉树的层序遍历详细讲解(附完整C++程序)
- 二叉树的遍历【 详细讲解 】
- 二叉树的遍历【 详细讲解 】
- 一个关于二叉树的创建、先序遍历、中序遍历、后序遍历、求叶子节点的完整函数的c语言完整程序。
- 二叉树的递归遍历和非递归遍历(附详细例子)
- 二叉树的递归遍历和非递归遍历(附详细例子)
- C语言二叉树的层序遍历
- C语言二叉树的层序遍历
- 二叉树(二)二叉树的层序遍历
- 二叉树的遍历(先、中、后、层序)C实现
- 【数据结构与算法】二叉树的遍历(递归遍历、非递归遍历、层序遍历)
- 二叉树的遍历(层遍历和深度遍历)
- (C语言)通过对二叉树的先序和中序遍历构建该二叉树,然后输出该二叉树的层序遍历结果
- 根据二叉树的前序遍历和中序遍历构建二叉树的c语言完整代码
- 数据结构的C实现_二叉树的非递归遍历和层序遍历
- 二叉树的层序遍历
- 二叉树的层序遍历
- 二叉树的层序遍历
- mysql-5.6.30-linux-glibc2.5-x86_64.tar.gz 安装
- React-Native自定义PopupWindow实现
- Java 并发编程 CAS
- Scala访问修饰符可见性问题(对比Java)
- python快速入门(4)判断结构
- 二叉树的层序遍历详细讲解(附完整C++程序)
- 机器学习入门基础文章
- CentOS6.7成功安装sbt
- POJ 2195 Going Home <最小费用最大流>
- react-native 从简单的事件分发来介绍redux
- Codeforces Round #422 (Div. 2) A. I'm bored with life
- mysql储存过程遇到的坑(while 循环中,select count(*) 总是返回0的解决方案 )
- 我的第一个Hbuilder项目
- Java连接数据库