前记
上周我投递出了简历,岗位是后端开发工程师。这周腾讯面试官给我进行了视频面试。面试过程中他问了二叉树的问题。二叉树相关算法题,在面试中出现的次数非常非常多,所以我面试之前也有所准备。今天结合面试问题详细讲一讲二叉树,结合实例分析二叉树的存储结构的建立方法和遍历过程。
面试问题
面试官大佬:看你的简历上写熟悉数据结构,谈谈二叉树遍历的方式?
我:(这可难不倒我)
先序遍历
先访问根节点,后依次访问左孩子和右孩子
递归算法
1 | 复制代码void PreOrder1(BTREE bt) //递归先根遍历 |
非递归算法
1 | 复制代码void PreOrder2(BTREE p)//非递归先根遍历 ,先访问根节点,后依次访问左孩子和右孩子 |
中序遍历
先访问左孩子,后依次访问根节点和右孩子
递归算法
1 | 复制代码void InOrder1(BTREE bt)//递归中序遍历 |
非递归算法
1 | 复制代码void InOrder2(BTREE p)//非递归中序遍历,先访问左孩子,然后访问根节点,后访问右孩子 |
后序遍历
先访问左孩子孩子,后依次访问右孩子和根节点
递归算法
1 | 复制代码void PostOrder1(BTREE bt)//后序遍历 |
非递归算法
1 | 复制代码void PostOrder2(BTREE p)//非递归后序遍历 ,先访问左孩子,然后访问右孩子,后访问根节点 |
面试官大佬:你回答得很好,还有其他遍历方式吗
我:……
沉默了几秒,我(这可难不倒我):还有一种层序遍历
层序遍历
从根开始,依次向下,对于每一层从左向右遍历
1 | 复制代码//层序遍历 |
遍历算法总结
面试官大佬:如何判断是否完全二叉树呢
我:(这可难不倒我)
判断完全二叉树
- 按层遍历二叉树, 从每层从左向右遍历所有的结点
- 如果当前结点有右孩子, 但没有左孩子, 那么不是完全二叉树
- 如果当前结点有左孩子但无右孩子, 那么它之后的所有结点都必须为叶子结点,否则不是完全二叉树
- 如果当前结点有左孩子和右孩子, 继续遍历
1 | 复制代码int Compnode(BTREE G)//判断是否是完全二叉树 |
总结
咱们玩归玩,闹归闹,别拿面试开玩笑。
二叉树的遍历虽然简单,但遍历方式多样,也有递归算法和非递归算法之分。一旦问到了,大家一定要回答全面,不要丢三落四,回答到点上。二叉树相关算法题,在面试中出现的次数非常非常多,大家面试前要把二叉树等数据结构的基础打牢。
如果有收获?希望老铁们来个双连击,给更多的人看到这篇文章
1、老铁们,关注我的原创微信公众号「程序猿的进阶」,主要是IT与竞赛
2、创作不易,顺便点个赞呗,可以让更多的人看到这篇文章,激励一下我这个小白。
本文转载自: 掘金