前记

上周我投递出了简历,岗位是后端开发工程师。这周腾讯面试官给我进行了视频面试。面试过程中他问了二叉树的问题。二叉树相关算法题,在面试中出现的次数非常非常多,所以我面试之前也有所准备。今天结合面试问题详细讲一讲二叉树,结合实例分析二叉树的存储结构的建立方法和遍历过程。

面试问题

面试官大佬:看你的简历上写熟悉数据结构,谈谈二叉树遍历的方式?

我:(这可难不倒我)

先序遍历

先访问根节点,后依次访问左孩子和右孩子

递归算法

void PreOrder1(BTREE bt) //递归先根遍历
{if (bt){if (bt->data != '#'){printf(" %c", bt->data);//结点不空 ,打印结点值 }PreOrder1(bt->lchild);//依次访问左右节点 PreOrder1(bt->rchild);}
}

非递归算法

void PreOrder2(BTREE p)//非递归先根遍历 ,先访问根节点,后依次访问左孩子和右孩子
{int top = -1;node *Q[N];while (p != NULL || top != -1){while (p != NULL){if (p->data != '#'){printf(" %c", p->data);}Q[++top] = p;p = p->lchild;}if (top != -1){p = Q[top--];p = p->rchild;}}
}

中序遍历

先访问左孩子,后依次访问根节点和右孩子

递归算法

void InOrder1(BTREE bt)//递归中序遍历
{if (bt){InOrder1(bt->lchild);//先访问左节点 if (bt->data != '#'){printf(" %c", bt->data);//结点不空 ,打印结点值 }InOrder1(bt->rchild);//先访问右节点 }
}

非递归算法

void InOrder2(BTREE p)//非递归中序遍历,先访问左孩子,然后访问根节点,后访问右孩子
{int top = -1;node *Q[N];while (p != NULL || top != -1){while (p != NULL){Q[++top] = p;p = p->lchild;}if (top != -1){p = Q[top--];if (p->data != '#'){printf(" %c",p->data);}p = p->rchild;}}
}

后序遍历

先访问左孩子孩子,后依次访问右孩子和根节点

递归算法

void PostOrder1(BTREE bt)//后序遍历
{if (bt){PostOrder1(bt->lchild);//先访问左,右孩子节点 PostOrder1(bt->rchild);if (bt->data != '#'){printf(" %c", bt->data);//后访问根节点 }}
}

非递归算法

void PostOrder2(BTREE p)//非递归后序遍历 ,先访问左孩子,然后访问右孩子,后访问根节点
{int top = -1;node *Q[N];int flag[N] = { 0 };while (p != NULL || top != -1){while (p != NULL){top++;Q[top] = p;flag[top] = 1;p = p->lchild;}while (top != -1 && flag[top] == 2){if (Q[top]->data != '#'){printf(" %c", Q[top]->data);top--;}}if (top != -1){flag[top] = 2;p = Q[top]->rchild;}}
}

面试官大佬:你回答得很好,还有其他遍历方式吗

我:……

沉默了几秒,我(这可难不倒我):还有一种层序遍历

层序遍历

从根开始,依次向下,对于每一层从左向右遍历

//层序遍历
void Sequense(BTREE bt)//建立栈,依次将根节点,左孩子,右孩子压栈 ,并打印栈顶元素
{node *Q[N];node *p;int front = 0, top = 0;if (bt != NULL){Q[++top] = bt;//将根节点压栈while (front < top) //遍历栈 {p = Q[++front];if (p->data != '#'){printf(" %c", p->data);//打印栈顶元素 }if (p->lchild){Q[++top] = p->lchild;//将左孩子压栈}if (p->rchild){Q[++top] = p->rchild;//将右孩子压栈}}}
}

遍历算法总结

面试官大佬:如何判断是否完全二叉树呢

我:(这可难不倒我)

判断完全二叉树

  1. 按层遍历二叉树, 从每层从左向右遍历所有的结点

  2. 如果当前结点有右孩子, 但没有左孩子, 那么不是完全二叉树

  3. 如果当前结点有左孩子但无右孩子, 那么它之后的所有结点都必须为叶子结点,否则不是完全二叉树

  4. 如果当前结点有左孩子和右孩子, 继续遍历

int Compnode(BTREE G)//判断是否是完全二叉树
{node *D[N], *p; //建立一个队列D[N]int front = 0, last = 0; //front是队头指针,last是队尾指针int tree_signal = 1;//tree_signal是判断是否为完全二叉树的标志int odd_signal = 1;//odd_signal是判断是否存在无左孩子的节点的标志if (G != NULL){last++;D[last] = G; //将根节点压入队尾while (front != last){front++;p = D[front];if (p->lchild == NULL ||(p->lchild)->data == '#') //*p节点没有左孩子{odd_signal = 0;if (p->rchild != NULL && (p->rchild)->data != '#') //没有左孩子但有右孩子,不是完全二叉树tree_signal = 0; }else //*p节点有左子树{if (odd_signal == 1) //目前不存在无左孩子的节点{last++; //左孩子进队D[last] = p->lchild;if (p->rchild == NULL || (p->rchild)->data == '#') //*p有左孩子但没有右孩子{odd_signal = 0;}else{last++; //右孩子进队D[last] = p->rchild;}}else       //目前存在有左孩子的节点,不是完全二叉树{tree_signal = 0; }}}}else{tree_signal = 0;//假设空树不是完全二叉树}return tree_signal;
}

总结

咱们玩归玩,闹归闹,别拿面试开玩笑。

二叉树的遍历虽然简单,但遍历方式多样,也有递归算法非递归算法之分。一旦问到了,大家一定要回答全面,不要丢三落四,回答到点上。二叉树相关算法题,在面试中出现的次数非常非常多,大家面试前要把二叉树等数据结构的基础打牢。

如果有收获?希望老铁们来个三连,点赞、收藏、转发

创作不易,别忘点个赞,可以让更多的人看到这篇文章,顺便鼓励我写出更好的博客

腾讯面试官这样问我二叉树,我刚好都会相关推荐

  1. 二叉树的建立与遍历完整代码_腾讯面试官这样问我二叉树,我刚好都会

    前记 上周我投递出了简历,岗位是后端开发工程师.这周腾讯面试官给我进行了视频面试.面试过程中他问了二叉树的问题. 二叉树相关算法题,在面试中出现的次数非常非常多,所以我面试之前也有所准备.今天结合面试 ...

  2. 腾讯面试官这样问我二叉树,我刚好都会 | 原力计划

    作者 | 天才程序YUAN 责编 | 夕颜 封图 | CSDN下载自视觉中国 出品 | CSDN(ID:CSDNnews) 前记 上周我投递出了简历,岗位是后端开发工程师.这周腾讯面试官给我进行了视频 ...

  3. 历时三个月我上岸了,分享一下我的手撕腾讯面试官经历,外包的你拿到这份面试大全你上你也行

    前言 首先跟大家聊点心里话吧,人人都想成为架构师,但往往只有10%的程序员能取得成功,想象很简单,但是坚持很难. 最后想给所有程序员一点建议:在日常工作中,万万不要仅局限于自己手头上的工作,因为自己负 ...

  4. 之前遇到一位老面试官,问我的问题真的有点东西

    这篇文章其实源于一次我的面试经历. 那次我面对是一位老面试官,真的很有东西. 那次面试我和他叨叨了两小时....我滴妈我嘴巴都干了真的. 他的提问都很有深度,可以说对我的学习之路有很大的帮助. 我记得 ...

  5. 面试官再问我如何保证 RocketMQ 不丢失消息,这回我笑了!

    0x00. 消息的发送流程 一条消息从生产到被消费,将会经历三个阶段: 生产阶段,Producer 新建消息,然后通过网络将消息投递给 MQ Broker 存储阶段,消息将会存储在 Broker 端磁 ...

  6. 二面京东,面试官直接问我JVM,我心里一阵暗爽~

    二面京东,面试官直接问我JVM,我心里一阵暗爽~简直了,hhhh 明人不说暗话,直接进入主题!!! 一.什么是JVM 二.JAVA代码编译和执行过程 类加载机制 类执行机制 三.JVM内存管理和垃圾回 ...

  7. 华为二面!!!面试官直接问我Java中到底什么是NIO?这不是直接送分题???

    华为二面!!!面试官直接问我Java中到底什么是NIO?这不是直接送分题??? 什么是NIO 缓冲区(Buffer) 缓冲区类型 获取缓冲区 核心属性 核心方法 非直接缓冲区和直接缓冲区 非直接缓冲区 ...

  8. 平面设计面试官常问的问题有哪些?

      平面设计面试官常问的问题有哪些?一般情况下都会有一个开篇的自我介绍,这里建议就用平常聊天说话的语气语速来介绍就可以,介绍自己扬长避短,多讲自己的前工作项目经验,在校获奖也可以讲.与工作岗位不强相关 ...

  9. 我以为自己MySQL够牛逼了,直到被腾讯面试官狠狠抽了两巴掌

    众所周知,简历上"了解=听过名字;熟悉=知道是啥;熟练=用过;精通=做过东西". 相信大家对于MySQL的索引都不陌生,索引(Index)是帮助MySQL高效获取数据的数据结构.索 ...

最新文章

  1. Python自动发送邮件-smtplib和email库
  2. 安卓开发真机遇到Failed to install Spaceassault.apk on device 'HT1CKV205198': timeout 测试机没有问题...
  3. C/Cpp / typeof、_typeof 和 _typeof_ 区别和联系
  4. 数据结构与算法基本思想
  5. 虚拟机拷贝数据到服务器,虚拟机文件拷到u盘上
  6. WeihanLi.Npoi 1.20.0 Released
  7. java 插件开发 互相依赖_java – Eclipse插件开发:有没有办法控制有关我的插件缺少依赖项的安装程序消息?...
  8. 下拉插件 (带搜索) Bootstrap-select 从后台获取数据填充到select的 option中 用法详解...
  9. STM32之ADC单通道连续例程
  10. 子div用了float浮动之后,如何撑开父元素,让父元素div自动适应高度的问题
  11. Dart的日期时间操作
  12. linux ras目录,Linux下配置站点-FTP-RSA私钥-公钥
  13. Android中View转换为Bitmap及getDrawingCache=null的解决方法
  14. 原创|批处理|批处理安卓log抓取工具
  15. C语言---简单五子棋小游戏
  16. Java实现屏幕截屏
  17. outlook服务器上修改文件保存,修改Outlook 2013数据文件(.ost)保存路径的方法
  18. Spring报错 Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException
  19. 支持微信多开、防止消息撤回的小助手
  20. 【RuTracker使用教程】

热门文章

  1. 关于ros仿真智能避障小车
  2. 《种子的梦想》(顾城 )
  3. 未来哪些职业会被chatGPT取代
  4. ejb客户端的三种调用方法,以及InitialContext lookup后的jndi对象在服务重启后缓存失效的问题
  5. 【算法分析与设计】回溯算法解决七巧板着色问题
  6. 东芝移动硬盘无法显示识别问题处理方式
  7. su: Authentication failure问题解决方式
  8. 多进程管理工具:goreman
  9. 如何解除网站的ip地址限制
  10. netty系列之:NIO和netty详解