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

前记

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

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

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,一经查实,立即删除!

相关文章

python教程程序_Python如何发布程序的详细教程

如何发布一个Python程序&#xff1a;1.安装一个pyInstaller在pycharm里点 file —–>setting—–>Project workspace——>Interpreter——>点pip右边的&#xff0b;号&#xff0c;进入下面这个界面&#xff1a;搜索pyInstaller, 点击左下方Iinstall package安装(出…

创建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执行…

如何保护python代码_如何在发布之前保护我的Python代码?

由于Python是一种按设计进行解释的语言&#xff0c;而且它将代码编译为字节码(这无助于隐藏它&#xff0c;因为字节码更容易反转)&#xff0c;因此没有真正安全的方法来隐藏源代码&#xff0c;因为它是不可恢复的&#xff0c;任何编程语言都是如此。在一开始&#xff0c;如果你…

python pandas教程百家号_Pandas 常见的基本方法

说明&#xff1a;文章所有内容均截选自实验楼教程【Pandas 使用教程】&#xff0c;想要查看教程完整内容&#xff0c;点击教程即可~前言&#xff1a;Pandas 是非常著名的开源数据处理工具&#xff0c;我们可以通过它对数据集进行快速读取、转换、过滤、分析等一系列操作。除此之…

python查看系统句柄数量_linux下查看系统进程占用的句柄数方法

---查看系统默认的最大文件句柄数&#xff0c;系统默认是1024# ulimit -n1024----查看当前进程打开了多少句柄数# lsof -n|awk {print $2}|sort|uniq -c|sort -nr|more131 2420457 2424457 24231   ........其中第一列是打开的句柄数&#xff0c;第二列是进程ID。可以根据ID号…

java静态变量实例变量_java中静态变量和实例变量的区别

实例变量&#xff1a;只有在创建了实例对象之后才会被分配空间&#xff0c;才可以使用静态变量&#xff1a;不需要创建实例对象就可以直接使用类名进行引用public class Different {public static int staticInt 0;//静态变量public int insInt 0;//实例变量public Different…

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

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

java sca视频教程_如何进入Java SCA软件的开发

该文档是SCA Java项目的开发者指南l一般性指南l获取源代码l配置你的开发环境l构建二进制和源代码发布包l导入SCA模块到你的开发IDE环境中l理解SCA代码路径l编码指南l测试lMaven构建结构l报告遇到的问题和提供补丁l开发提示为Webapp样例代码生成Eclipse WTP Web工程为样例中的程…

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

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

java js webservice_java Web技术探路:js Ajax调用WebService

StuList new List();for (int i 0; i < 10; i){Student s new Student();s.Sid i 1;s.Name "Tom"s.Sid;s.Sex "男";s.Age i 1;StuList.Add(s);}return StuList;}}}注意&#xff1a;我们分别看一下这几个方法的签名&#xff0c;这很重要&#x…

python下载晚上excel_Python自动操控excel,一小时解决你一天的工作

过去&#xff0c;在很多金融、市场、行政的招聘中&#xff0c;面试官都会问一句&#xff1a;“你精通 EXCEL 吗&#xff1f;”但今天&#xff0c;他们可能更喜欢问&#xff1a;“你会 Python 吗&#xff1f;”越来越多的企业开始用 Python 处理数据&#xff0c;特别是金融、证券…

java 注释 过时_Java 注解

前言为什么需要学习注解?1.能够灵活地使用框架提供的注解,最后能够读懂框架的源码2.能够配合反射将代码书写更加的灵活,更加易于维护易于扩展,Properties配置,XML配置,注解配置[Java配置]3.极大程度地简化了代码,提高了代码的可读性注解的概述Java提供了一种源程序中元素和任何…

python模拟登录淘宝直通车_Python实现的淘宝直通车数据抓取(1)

最近帮一个朋友做一个抓取淘宝直通车数据的小项目&#xff0c;感觉ython比较适合写爬虫程序&#xff0c;决定使用Python来做程序。首先是登陆程序&#xff0c;因为淘宝的登陆校验很复杂&#xff0c;所以不能直接使用命令行的形式输入账号密码。查阅资料后&#xff0c;发现可以使…

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

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

python爬虫验证码的识别_Python爬虫识别验证码

Python爬虫识别验证码安装tesserocrpip3 install tesserocr pillow识别测试将验证码图片放到项目根目录下&#xff0c;用tesserocr库识别该验证码&#xff0c;代码如下所示&#xff1a;import localelocale.setlocale(locale.LC_ALL, C)import tesserocrfrom PIL import Imagei…

python对象属性赋值_关于python对象 中dict属性赋值的疑问

下面这段代码 很奇怪把两个对象放在一个 list中然后循环操作两个对象 中 一个dict key的数值但是循环操作输出的时候发现两个对象的 值会叠加#!/usr/bin/env pythonclass test:base {score : 100}def setBase(self, score):self.base[score] scoredef addScore(self):self.se…

java mysql jsp分页代码_JSP实现数据库分页显示源代码例

JSP实现数据库分页显示源代码例2018-11-25分页显示数据库信息分页显示数据库记录用户名性别电话E-Mailtry{//驱动程序名String driverName"sun.jdbc.odbc.JdbcOdbcDriver";//连接字符串String url"jdbc:odbc:userdata";//加载驱动程序Class.forName(driver…

java解压zip异常_java解压zip文件示例

若是使用Java自带的压缩工具包来实现解压缩文件到指定文件夹的功能&#xff0c;因为jdk提供的zip只能按UTF-8格式处理&#xff0c;而Windows系统中文件名是以GBK方式编码的&#xff0c;所以如果是解压一个包含中文文件名的zip包&#xff0c;会报非法参数异常&#xff0c;所以要…

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

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