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

前记

上周我投递出了简历,岗位是后端开发工程师。这周腾讯面试官给我进行了视频面试。面试过程中他问了二叉树的问题。

二叉树相关算法题,在面试中出现的次数非常非常多,所以我面试之前也有所准备。今天结合面试问题详细讲一讲二叉树,结合实例分析二叉树的存储结构的建立方法和遍历过程。

3d1fcdaf3605c7728fd00112f74afcae.png

面试官

面试问题

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

我:(这可难不倒我)

先序遍历

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

递归算法

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;//将右孩子压栈}}}}

遍历算法总结

a61d3f2d4119dbe437d2db738922a1cc.png

面试题目

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

我:(这可难不倒我)

判断完全二叉树

  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;}

总结

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建mysql数据库图解_mysql数据库怎么创建外键?(图文+视频)

本篇文章主要给大家介绍mysql数据库怎么创建外键。关于mysql数据库外键的基础介绍&#xff0c;我们在这篇文章【Mysql外键是什么&#xff1f;有哪些用处&#xff1f;】中&#xff0c;已经给大家介绍过了&#xff0c;需要的朋友可以选择参考。了解了外键的基础定义&#xff0c;那…

redis 管理工具_Redis桌面管理工具Redis Desktop Manager 2019.2发布

简介Redis桌面管理器(又名RDM) - 是适用于Windows&#xff0c;Linux和MacOS的快速开源Redis数据库管理应用程序。该工具为您提供了一个易于使用的GUI&#xff0c;可以访问您的Redis数据库并执行一些基本操作&#xff1a;将键视为树&#xff0c;CRUD键&#xff0c;通过shell执行…

sql in里面可以放多少参数_如何从文本文件读入 SQL 参数

有时我们希望把参数列表分行存储在文本文件里&#xff0c;执行SQL时再拼到in函数里&#xff0c;从而查询出符合条件的记录。但SQL不能解析文本文件&#xff0c;直接拼到in函数里有困难&#xff0c;所以很多人先把文件导入数据库临时表&#xff0c;再用join语句做关联&#xff0…

谷歌浏览器32位安装包_谷歌浏览器发布紧急安全更新修复Blink内核中的任意代码执行漏洞...

上月底谷歌浏览器推送紧急安全更新对浏览器漏洞进行修复&#xff0c;当时谷歌浏览器博客并未公布漏洞的具体细节信息。蓝点网当时也在文章中称通常这种不公布漏洞的更新&#xff0c;都是比较严重的问题因此只有等多数用户修复后才会公开。现在多数能够自动更新的用户已经升级到…

java的serversocket_Java ServerSocket 实现聊天室功能(简易版)

大体实现功能可以选择房间&#xff0c;可以与房间中的用户进行实时的交流说在前面的话:serverSocket.accept() 会形成阻塞scanner.hasNextLine() 和 scanner.nextLine() 也会形成阻塞windows 下需要打开telnet服务。请自行百度实现思路:用户连接上服务器后选择房间号&#xff0…

ensp删除所有命令_HCIA学习笔记——eNSP配置NAT技术

今天用华为的eNSP做了关于NAT的实验&#xff0c;我把它发了出来&#xff0c;有需要的小伙伴可以收藏一下。分别配置了静态的NAT&#xff0c;NAT Outbound配置&#xff0c;Easy IP配置&#xff0c;NAT server配置。接口配置如图所示。在网关路由器上配置访问外网的默认路由。配置…

java程序员用代码写的情书_用代码写的三行情诗,你懂得程序员的浪漫吗?

原标题&#xff1a;用代码写的三行情诗&#xff0c;你懂得程序员的浪漫吗&#xff1f;在一般人眼里&#xff0c;程序员是一群古板&#xff0c;技术宅&#xff0c;不懂得浪漫的屌丝&#xff0c;但其实这些大神们浪漫起来也是相当可以的&#xff01;下面让我们来看一下程序员们用…

对比四大企业级linux版本_Linux家族族谱

大体上来讲&#xff0c;Linux分为两个生态体系&#xff0c;红帽和debian。商业版本以Redhat为代表&#xff0c;开源社区版本则以debian为代表。红帽家族redhat &#xff1a;红帽自家服务器centos &#xff1a;基于红帽重新封装的去掉版权信息的免费版本fedora &#xff1a;基于…

mysql vim 命令_Vim基本命令必知必会

光标移动定位方式hjkl (强例推荐使用其移动光标&#xff0c;但不必需) →你也可以使用光标键 (←↓↑→). 注: j 就像下箭头0 → 数字零&#xff0c;到行首^ → 到本行第一个不是blank字符的位置(所谓blank字符就是空格&#xff0c;tab&#xff0c;换行&#xff0c;回车等)$ →…

内存条上面参数详解_为什么买内存条要看时序?别以为内存频率高性能就好

2016年开网吧买了400多根DDR4 8G内存条&#xff0c;一根180。2017年网吧赔了钱&#xff0c;我把电脑卖了&#xff0c;内存600一根&#xff0c;结果开网吧的钱赚回来了。囤内存挣回了开网吧的钱转眼间到2019年&#xff0c;内存就跌回了原来的价钱&#xff0c;200多块就又能买到D…

android 获取monkey日志_Android压力测试:monkey压力测试实战

主要分享的主题是 Android App 专项测试&#xff0c;通过 monkey 进行压力测试。一.测试步骤1.安装ADB2.连接被测手机和电脑3.打开CMD命令行4.输入monkey命令adb shell monkey -p your.package.name?--pct-touch 30?--ignore-crashes ?--ignore-timeouts--throttle 250?-s …

java工程怎么构造成moven_将普通java工程结构改为由maven管理的工程结构域

第一次尝试些博客记录一下自己的学习心得!1. http://maven.apache.org/download.cgi 这是maven 的下载链接进入链接下载一个maven 包这是我的windows10 系统下载的版本2 . 将下载好的文件解压后放入任意位置(一般建议放到自己常用的文件夹下边)并记住该路径G:\xiangmuwar …

python 函数进度条怎么_刷新你对进度条的认识,用python写出不一样的进度条

1 简介在日常工作中&#xff0c;我们运行程序经常会用到「循环迭代」&#xff0c;假如这个执行时间很短&#xff0c;那倒也无所谓。但是有一些过程耗时蛮长的&#xff0c;给其加上「进度条」(progress bar)&#xff0c;可以帮我们监控代码执行进度&#xff0c;以及过程出现异常…

acer软件保护卡清除工具clear_使用Windows 10内置工具释放硬盘空间的最佳方法

如果您的磁盘空间不足&#xff0c;可以使用 Windows 10 中内置的工具来清理垃圾文件、应用程序和游戏等&#xff0c;以优化硬盘空间。使用这些清理工具不仅能够释放空间&#xff0c;而且还有助于提高系统性能。下面小编就为大家汇总介绍 几种种最佳快捷方法&#xff0c;来释放 …

python中astr是啥_python的基本操作

该来的还是来了&#xff0c;早先某个大胖子建议我写关于python基本操作的博客&#xff0c;当时没上心&#xff0c;现在来补点账&#xff0c;也姑且算是对往昔一点回忆吧。对了&#xff0c;那胖子&#xff0c;姓王&#xff0c;所幸不住我隔壁。闲言少叙&#xff0c;python和pych…

canal mysql从库_大厂如何基于binlog解决多机房同步mysql数据(一)?

目录前言单一IDC多IDCmysql主从同步数据同步方案多机房mysql同步方案优化同步方案同步方案的问题如何解决重复插入对于DDL语句处理如何解决唯一索引冲突如何解决数据回环问题总结前言小伙伴们是否经常听说多机房部署&#xff0c;异地容灾&#xff1f;什么两地3中心&#xff0c;…

java语言怎么建立窗口awt,java.awt.Frame类:创建窗口

创建窗口是 AWT 编程的第一步&#xff0c;窗口是所有组件和面板的容器。在 Java AWT 中&#xff0c;我们使用 Frame 类来创建窗口。Frame 中文字意是“框架”&#xff0c;它的主要功能是建立窗口。AWT 建立窗口的步骤如下&#xff1a;设计 Frame 类对象&#xff0c;建立空白窗口…

sql数据导入错误代码: 0x80004005_SQL入门第八关 项目实战

不知不觉&#xff0c;学SQL已经一个多月了&#xff0c;每天下班学一个小时&#xff0c;有空做做练习题。从之前的焦虑到现在已经有了一定的自信了&#xff0c;猴子的课程真的很适合小白入门&#xff0c;尤其是SQL学习群里&#xff0c;助教老师很尽责&#xff0c;每个问题都会解…

虚拟主机选择php版本,虚拟主机的php版本如何选择

虚拟主机如何选择php版本&#xff1f;虚拟主机选择PHP版本&#xff0c;这是根据网站程序设置的。例如&#xff0c;新版本的WordPress需要PHP5.6和更高版本&#xff0c;而旧版本&#xff0c;如WordPress4&#xff0c;可以使用PHP5.2、5.3和其他更低版本。虚拟主机的PHP版本是什么…

有十五个数按由大到小顺序存放在一个数组中_数据结构基础 (代码效率优化, 线性表, 栈, 队列, 数组,字符串,树和二叉树,哈希表)...

作者&#xff1a;张人大代码效率优化复杂度 -- 一个关于输入数据量n的函数时间复杂度 -- 昂贵与代码的结构设计有着紧密关系一个顺序结构的代码&#xff0c;时间复杂度是O(1), 即任务与算例个数 n 无关空间复杂度 -- 廉价与数据结构设计有关数据结构 -- 考虑如何去组织计算机中…