0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

面试算法之重建二叉树

算法与数据结构 来源:算法与数据结构 2019-11-27 15:59 次阅读

从今天开始,公众号陆陆续续开始插写用动画形式展现算法题,如剑指offer、Leedcode里经典面试题型,同时也会更新数据结构与算法基础、网络原理等知识。

以为无论是面试还是实际项目,对算法的要求也非常的严格,所以小鹿尽最大努力把算法还原成动画形式来讲解,争取让每个人都能看懂算法、学会算法。

1

题目

已知前序遍历为{1,2,4,7,3,5,6,8},中序遍历为{4,7,2,1,5,3,8,6},它的二叉树是怎么样的?

2

基础巩固

根据上述题目所述,我们已知前序遍历和中序遍历,回顾一下,什么是前序遍历?什么是中序遍历?

2.1 前序遍历

前序遍历一颗二叉树,首先输出根节点,然后输出左子节点,最后输出右子节点。

比如,遍历一下二叉树:

颜色变深表示遍历,突出表示输出

2.2 中序遍历

中序遍历一棵二叉树,首先输出左子节点,然后输出输出根节点,最后右子节点。

以上边二叉树为例,通过中序遍历输出。

3

解题思路

既然我们知道了二叉树如何进行前序遍历和中序遍历了,那么已知前序遍历和中序遍历如何反推二叉树呢?

那么问题来了,只知道前序遍历能不能反推二叉树呢?我们就试一下,比如题目中所述,{1,2,4,7,3,5,6,8},根据前序遍历,根、左、右,1 肯定是 根节点,那么一下2,4,7.....哪些是左子节点呢?左子节点有几个呢?很显然我们是不知道的,由此可以得出,只知道前序遍历是不可能反推出二叉树的,中序遍历也是如此,自己可以尝试一下。

那么前序遍历和中序遍历可不可以?那我们要试一下,我们上边通过前序遍历找到第一个根节点就是 1,如图

中序遍历{4,7,2,1,5,3,8,6}的规律又是左、根、右,所以 1 结点在中序遍历中为根,它的左边就是所有左子节点4,7,2,右边为所有的右子节点5,3,8,6。

此时我们已经划分左右子节点了,但是左边的子节点中哪些又是根节点呢?我们再回到前序遍历中,根据前序遍历的特点,根、左、右,在从子节点进行划分,那么 1 结点中的子节点谁为根节点呢?

我们一眼就能看出来,就是 2 结点,那么剩余的 4,7 左右结点怎么分呢?我们根据上述再回到中序遍历,找到 2 根节点,根据中序遍历左、根、右的特点,找到 2 结点,那左边的就是左子节点,右边的就是右子节点,我们可以看到,左边有两个数,正是 4 和 7 结点。

右边只有 1 结点,1 结点我们刚刚说了,是根节点,所以以 2 为根节点是没有右子节点的,剩下的数字也是同样的方式区分,自己可以试一下,动手画一画。

我们仔细发现,其实整个层层往下,以及左右,都是相同的解决方式,而且大问题可以分解为小问题,我们下意识就应该想起小鹿之前分享过的知识,那就是递归,既然是递归,就应该有终止条件,终止条件就是当子节点为空时,此时递归结束。

4

测试用例

我们之前的文章强调过,手写代码之前,一定先把测试用例想好,为了能够在手写代码的时候考虑到边界情况,还为了防止你到时候面试涂涂改改。

4.1 普通测试

完全二叉树、非完全二叉树。

4.2 特殊测试

只有左子节点二叉树,只有右子节点、只有一个结点的二叉树 —— 特殊二叉树测试。

4.3 输入测试

空树、空指针null、前序和中序不匹配。

5

代码实现

JavaScript 版本

Java 版本

C 语言版本

Python 版本

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4599

    浏览量

    92619
  • 二叉树
    +关注

    关注

    0

    文章

    74

    浏览量

    12311

原文标题:动画:面试算法之重建二叉树

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    什么是默克尔(Merkle Tree)?如何计算默克尔根?

    01 默克尔的概念 默克尔(Merkle Tree)是一种特殊的二叉树,它的每个节点都存储了一个数据块的哈希值。哈希值是一种可以将任意长度的数据转换为固定长度的字符串的算法,它具有
    的头像 发表于 09-30 18:22 587次阅读
    什么是默克尔<b class='flag-5'>树</b>(Merkle Tree)?如何计算默克尔根?

    面试嵌入式工作,会被问什么问题?

    面试嵌入式工作时,面试官可能会从多个方面考察应聘者的知识、技能和经验。以下是一些常见的嵌入式工作面试问题,这些问题涵盖了基础知识、专业技能、项目经验和个人能力等方面
    的头像 发表于 07-17 09:26 1861次阅读
    <b class='flag-5'>面试</b>嵌入式工作,会被问什么问题?

    指电极上覆盖敏感材料的阻值计算

    覆盖的敏感材料厚度超出指厚度时计算电阻,是否可以视作指电极指间电阻多个周期串联后与超出指厚度部分敏感材料电阻并联
    发表于 07-05 14:48

    指MOSFET器件静电防护鲁棒性提升技巧

    栅极接地NMOS是一种广泛应用的片上ESD器件结构,为达到特定ESD防护等级,一般会采用多指版图形式来减小器件占用的芯片面积。但是,多指栅极接地NMOS在ESD应力作用下,各个指难于做到均匀
    的头像 发表于 06-22 00:50 474次阅读
    多<b class='flag-5'>叉</b>指MOSFET器件静电防护鲁棒性提升技巧

    康谋分享 | aiSim5仿真场景重建感知置信度评估(三)

    aiSim5能重建高精度的赛道、车库、高速公路等真实交通场景,用于测试和训练ADAS/AD系统。通过全局行动日志,能将驾驶数据转化为场景重建,车道线检测算法和多目标检测算法在仿真与现实
    的头像 发表于 05-08 16:59 2393次阅读
    康谋分享 | aiSim5仿真场景<b class='flag-5'>重建</b>感知置信度评估(三)

    哈夫曼编码怎么算 哈夫曼编码左边是0还是1

    二叉树,将出现频率高的字符用较短的编码表示,而出现频率低的字符则用较长的编码表示。通过这种方式,可以实现对数据进行高效的编码和解码。 下面我们将详细介绍哈夫曼编码的算法过程。 统计字符频率 在进行哈夫曼编码前,首先需
    的头像 发表于 01-30 11:27 2556次阅读

    基于NeRF/Gaussian的全新SLAM算法

    基于NeRF的SLAM算法采用全局地图和图像重建损失函数,通过可微分渲染捕获稠密的光度信息,具有高保真度。
    的头像 发表于 01-26 10:48 612次阅读
    基于NeRF/Gaussian的全新SLAM<b class='flag-5'>算法</b>

    工业上常见的高精度主动式重建算法

    三维重建目前是最为炙手可热的领域。摄影测量或结构光投影技术可以解决漫反射重建问题,但却无法有效应对镜面反射物体(如玻璃、积水、反光物体和汽车车身)等的重建挑战。
    发表于 01-05 10:46 431次阅读
    工业上常见的高精度主动式<b class='flag-5'>重建</b><b class='flag-5'>算法</b>

    十大排序算法总结

    排序算法是最经典的算法知识。因为其实现代码短,应该广,在面试中经常会问到排序算法及其相关的问题。一般在面试中最常考的是快速排序和归并排序等基
    的头像 发表于 12-20 10:39 1078次阅读

    如何修改内核设备

    如何修改内核设备
    的头像 发表于 12-14 14:06 767次阅读
    如何修改内核设备<b class='flag-5'>树</b>

    决策:技术全解与案例实战

    决策算法是机器学习领域的基石之一,其强大的数据分割能力让它在各种预测和分类问题中扮演着重要的角色。
    的头像 发表于 12-13 09:49 1212次阅读
    决策<b class='flag-5'>树</b>:技术全解与案例实战

    使用Python从2D图像进行3D重建过程详解

    有许多不同的方法和算法可用于从2D图像执行3D重建。选择的方法取决于诸如输入图像的质量、摄像机校准信息的可用性以及重建的期望准确性和速度等因素。
    的头像 发表于 12-05 14:07 2803次阅读
    使用Python从2D图像进行3D<b class='flag-5'>重建</b>过程详解

    NeurIPS 2023 | 清华ETH提出首个值化光谱重建算法

    压缩重建工具包 BiSCI 内,该工具包支持八类最主要的值网络,欢迎大家来使用。同时,我们还将 BiSRNet 嵌入到了我们之前开发的光谱重建工具箱 MST 当中。目前 MST 工具包已支持超过 12 类深度学习
    的头像 发表于 12-03 20:20 626次阅读
    NeurIPS 2023 | 清华ETH提出首个<b class='flag-5'>二</b>值化光谱<b class='flag-5'>重建</b><b class='flag-5'>算法</b>

    堆的实现思路

    什么是堆? 堆是一种 基于树结构的数据结构,它是一棵二叉树 ,具有以下两个特点: 堆是一个完全二叉树,即除了最后一层,其他层都是满的,最后一层从左到右填满。 堆中每个节点都满足堆的特性,即父节点的值
    的头像 发表于 11-24 16:02 394次阅读
    堆的实现思路

    二叉树的定义

    型结构 是一类重要的 非线性数据结构 ,其中以二叉树最为常用,直观来看,是以分支关系定义的层次结构。型结构在客观世界中广泛存在,比
    的头像 发表于 11-24 15:57 1274次阅读
    <b class='flag-5'>树</b>与<b class='flag-5'>二叉树</b>的定义