二叉树的前序,中序,后序遍历

2023-05-16

前序遍历:根节点->左子树->右子树(根->左->右)

中序遍历:左子树->根节点->右子树(左->根->右)

后序遍历:左子树->右子树->根节点(左->右->根)

技巧:看根节点打印的顺序,出现在前还是中,后. 

 

前序遍历:GDAFEMHZ

中序遍历: ADEFGHMZ

后序遍历:AEFDHZMG


前序:

第一步:打印该节点(再三考虑还是把访问根节点这句话去掉了)

第二步:访问左子树,返回到第一步(注意:返回到第一步的意思是将根节点的左子树作为新的根节点,就好比图中D是G的左子树但是D也是A节点和F节点的根节点)

第三步:访问右子树,返回到第一步

第四步:结束递归,返回到上一个节点


中序:

第一步:访问该节点左子树

第二步:若该节点有左子树,则返回第一步,否则打印该节点

第三步:若该节点有右子树,则返回第一步,否则结束递归并返回上一节点

(按我自己理解的中序就是:先左到底,左到不能在左了就停下来并打印该节点,然后返回到该节点的上一节点,并打印该节点,然后再访问该节点的右子树,再左到不能再左了就停下来)


后序:

第一步:访问左子树

第二步:若该节点有左子树,返回第一步

第三步:若该节点有右子树,返回第一步,否则打印该节点并返回上一节点

 后序遍历的另一种表述:

(1)后序遍历左子树

(2)后序遍历右子树

(3)访问根节点

(在完成1,2步的时候,依然要按照后序遍历的规则来完成)

案例分析

第一种:已知前序遍历、中序遍历求后序遍历

前序遍历:ABCDEF

中序遍历:CBDAEF

求后序遍历?

解题思路

1、前序遍历的第一元素是整个二叉树的根节点

2、中序遍历中根节点的左边的元素是左子树,根节点右边的元素是右子树

3、后序遍历的最后一个元素是整个二叉树的根节点

第一步:先看前序遍历A肯定是根节点

第二步:确认了根节点,再来看中序遍历,中序遍历中根节点A的左边是CBD,右边是EF,所有可以确定二叉树既有左子树又有右子树

第三步:先来分析左子树CBD,那么CBD谁来做A的左子树呢?这个时候不能直接用中序遍历的特点(左->根->右)得出左子树应该是这个样子

因为有两种情况都满足中序遍历为CBD无法直接根据中序遍历来直接得出左子树的结构,这个时候就要返回到前序遍历中去

观察前序遍历ABCDEF,左子树CBD在前序遍历中的顺序是BCD,意味着B是左子树的根节点(这么说可能不太好理解,换个说法就是B是A的左子树),得出这个结果是因为如果一个二叉树的根节点有左子树,那么

这个左子树一定在前序遍历中一定紧跟着根节点(这个是用前序遍历的特点(根->左->右)得出的),到这里就可以确认B是左子树的根节点

第四步:再观察中序遍历CBDAEF,B元素左边是C右边是D,说明B节点既有左子树又有右子树,左右子树只有一个元素就可以直接确定了,不用再返回去观察前序遍历

第五步:到这里左子树的重建就已经完成了,现在重建右子树,因为重建右子树的过程和左子树的过程一模一样,步骤就不像上面写这么细了((┬_┬)),观察中序遍历右子树为EF,再观察前序遍历ABCDEF中右子树

的顺序为EF,所以E为A的右子树,再观察中序便利中E只有右边有F,所有F为E的右子树,最后得到的二叉树是这个样子的

所以求得的后序遍历为:CDBFEA

总结一下上述步骤: 先观察前序遍历找到根节点->观察中序遍历将根节点左边归为左子树元素,右边归为右子树元素(可能会出现只有左子树或者右子树的情况)->观察前序遍历中左\右子树几个元素的顺序,最靠前的为左\右子树的根节点->重复前面的步骤

第二种:已知中序遍历、后序遍历求前序遍历(题还是上面这道)

中序遍历:CBDAEF

后序遍历为:CDBFEA

仍然是根据不同遍历方式结果的特点来重构二叉树,过程很相似这里就不详细说了,后序遍历的最后一个元素A是根节点,在中序遍历中以根节点A作为分界将元素分为左子树(CBD)和右子树(EF),再观察后序遍历中左子树的顺序是CDB

,可以判断出B是左子树的根节点(因为后序遍历是:左->右->根),再观察中序遍历,B元素左边是C右边是D,说明B节点既有左子树又有右子树,左右子树只有一个元素就可以直接确定了,不用再返回去观察后序遍历,左子树重建完成,

现在来看右子树,右子树有两个元素EF,观察后序遍历E在F的后面,所以E是右子树的根节点,然后看中序遍历中E只有右边一个F元素了,即F是E的右子树,此时整个二叉树重构完成

 

总结一下上述步骤:先观察后序遍历找到根节点->观察中序遍历将根节点左边归为左子树元素,右边归为右子树元素(可能会出现只有左子树或者右子树的情况)->观察后序遍历中左\右子树几个元素的顺序,最靠后的为左\右子树的根节点->重复前面的步骤

注意:已知前序遍历、后序遍历无法求出中序遍历(因为由前序后序重构出来的二叉树不止一种)

前序遍历


 1 /* 以递归方式 前序遍历二叉树 */
 2 void PreOrderTraverse(BiTree t, int level)
 3 {
 4     if (t == NULL)    
 5     {
 6         return ;
 7     }
 8     printf("data = %c level = %d\n ", t->data, level);
 9     PreOrderTraverse(t->lchild, level + 1);
10     PreOrderTraverse(t->rchild, level + 1);
11 }

 

中序遍历


 1 /* 以递归方式 中序遍历二叉树 */
 2 void PreOrderTraverse(BiTree t, int level)
 3 {
 4     if (t == NULL)    
 5     {
 6         return ;
 7     }
 8     PreOrderTraverse(t->lchild, level + 1);
 9     printf("data = %c level = %d\n ", t->data, level);
10     PreOrderTraverse(t->rchild, level + 1);
11 }

 

后序遍历


 1 /* 以递归方式 后序遍历二叉树 */
 2 void PreOrderTraverse(BiTree t, int level)
 3 {
 4     if (t == NULL)    
 5     {
 6         return ;
 7     }
 8     PreOrderTraverse(t->lchild, level + 1);
 9     PreOrderTraverse(t->rchild, level + 1);
10     printf("data = %c level = %d\n ", t->data, level);
11 }

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二叉树的前序,中序,后序遍历 的相关文章

  • 设置光标输出位置

    void gotoXY short x short y 设置光标输出位置 COORD pos 61 x y HANDLE out 61 GetStdHandle STD OUTPUT HANDLE SetConsoleCursorPosit
  • tensorflow错误 Assign requires shapes of both tensors to match. lhs shape= rhs shape=

    在跑tensorflow任务的时候 xff0c 有时候会碰到这种错误 Tensorflow Assign requires shapes of both tensors to match lhs shape 61 20 rhs shape
  • 贪吃蛇游戏源码(可在VC++6.0运行)(在原作者的基础上进行小改进)

    自己做的第一个游戏 xff01 xff01 xff01 说说制作历程吧 xff1a 1 阅读并理解原作者 xff08 没有找到作者名 xff09 源码 2 仿写一边源码 3 经过一天的冥想 xff08 其实是玩了一天吃鸡 xff09 4 然
  • MFC插背景图

    把下面这段代码加进OnPaint 里就行了 CPaintDC dc this CBitmap bitmap bitmap LoadBitmap IDB BITMAP1 这个IDB BITMAP1要自己添加 CBrush brush brus
  • MFC按钮跳转

    需要先添加新建的dialo 的头文件 例如 include 34 AAA h 34 void COnclickDlg OnBnClickedOk AAA Dlg Dlg DoModal
  • MSDN关闭窗口

    退出程序用 AfxGetMainWnd gt SendMessage WM CLOSE 关闭当前窗口 用 DestroyWindow 关闭模式对话框用 EndDialog 0
  • 链表的插入和删除

    while NULL 61 p amp amp i lt pos 1 插入 p 61 p gt pNext 43 43 i if NULL 61 61 p i gt pos 1 return false while NULL 61 p gt
  • 初始化!

    int length list PNODE pHead int len 61 0 需要初始化 xff0c 不然会显示乱码 PNODE p 61 pHead gt pNext while NULL 61 p len 43 43 p 61 p
  • Python爬虫:爬虫所需要的爬虫代理ip是什么?

    当我们对某些网站进行爬去的时候 xff0c 我们经常会换IP来避免爬虫程序被封锁 代理ip地址如何获取 xff1f 其实也是一个比较简单的操作 xff0c 目前网络上有很多IP代理商 xff0c 例如西刺 xff0c 芝麻 xff0c 犀牛
  • MySQL知识点

    主键自增 JDBC中MySQL自增主键的值 xff1a 是通过connection连接发送sql语句时多传入一个参数conn prepareStatement sql PreparedStatement RETURN GENERATED K
  • C语言实现FTP文件传输

    一 要求 FTP实则为两个程序的互相交流 xff0c 把信息指令相互发送并处理 1 客户端请求下载文件 把文件名发送给服务器 2 服务器接收客户端发送的文件名 根据文件名找到文件 xff0c 把文件大小发送给客户端 3 客户端接收到文件大小
  • 我的2013,它不平淡

    2013年春节过后 xff0c 等我再赴学校 xff0c 我已经是大三下学期的学生了 对于一名软件学院的学生 xff0c 这就意味着要整备离开校园出去实习了 果然 xff0c 陆陆续续各大软件公司 xff08 培训部门而已 xff09 或培
  • mac下office文档自动恢复

    如果想要查找mac上自动恢复的文件 xff0c 可以在如下的文件目录中找到 xff0c 注意将 username 替换为自己的用户名 xff1a Excel Users username Library Containers com mic
  • FreeRTOS消息队列/信号量/事件

    1 消息队列主要用于任务之间消息的传递 2 信号量分为计数信号量 二值信号量 互斥信号量 3 事件用于外部事件的触发 4 计数信号量用于发生次数的统计 读取以后可以减1 二值信号量 互斥信号量与二值信号量的主要区别是可以防止优先级翻转 5
  • python装饰器详解-python中的装饰器详解

    在了解装饰器的之前一定要先了解函数作为参数传递 什么是函数内嵌 请参考我之前写的博客函数简介 因为在python里面 函数也是对象 也可以作为参数进行传递 python装饰器本质也是一种特殊函数 它接收的参数是函数对象 然后动态地函数参数添
  • python装饰器详解-python装饰器的详细解析

    什么是装饰器 xff1f python装饰器 xff08 fuctional decorators xff09 就是用于拓展原来函数功能的一种函数 xff0c 目的是在不改变原函数名 或类名 的情况下 xff0c 给函数增加新的功能 这个函
  • 安装oracle出现环境不满足最低要求

    安装win64 11gR2 database 1of2的时候出现这个 xff0c 百度了下解决方法 在oracle安装包找到stage文件夹 然后找到cvu 然后在cvu里面找到cvu prereq xff0c 用记事本打开 增加以下内容
  • mybatis的优缺点

    优点 xff1a 1 基于SQL语法 xff0c 简单易学 2 能了解底层组装过程 3 SQL语句封装在配置文件中 xff0c 便于统一管理与维护 xff0c 降低了程序的耦合度 4 程序调试方便 5 与传统JDBC比较较少了大量的代码量
  • Eclipse打不开,提示查看Log文件

    今天在使用Eclipse的时候 xff0c Eclipse整个黑屏 xff0c 然后果断启动任务管理器 xff0c 关掉了Eclipse然后重启 xff0c 发现Eclipse打不开了 xff0c 然后提示查看log文件 xff0c 然后解
  • equals的用法的注意事项

    String a 61 34 equals的用法 34 String b 61 a equals 34 equals的用法 34 34 相等 34 34 不相等 34 这样的用法有隐患 xff0c 当传入的参数a是空值的时候 xff0c 程

随机推荐

  • svnE175002、E160024以及提交冲突解决方法

    E17005与Eclipse代理有关 xff0c 将代理勾选掉 xff0c 把active provider 改为Direct 即可 E160024 是以为有的文件过期了 xff0c 右键更新即可 最后 xff0c svn代码提交冲突的时候
  • break和continue的区别

    1 一般的continue会退回最内层循环的开头 xff08 并继续执行 xff09 2 带标签的continue会到达标签的位置 xff0c 并重新进入紧接在那个标签后面的循环 3 一般的break会中断并跳出当前循环 4 带标签的bre
  • samba服务常用命令

    sudo vim etc samba smb conf 里增添用户 span class token punctuation span bsp span class token punctuation span comment span c
  • 用mac进行图片的自由裁剪

    用mac上自带的图片预览工具 xff0c 即可完成对图片的自由裁剪
  • WEB项目部署到Linux下无法访问html、css、js等静态文件的解决

    WEB项目 xff0c 在自己本机 xff08 windows xff09 下通过Tomcat访问 一切正常 部署到Linux下的Tomcat 进行访问 除了 do接口和jsp页面能访问外 其他的都不能访问 原因 xff1a 默认80端口
  • Java规范的三种注释方式

    在学习开发中药养成良好的编码习惯 xff0c 规整的代码格式会为程序日后的维护工作提供便利 在此对编码规则做了以下总结 xff1a 1 每条语句尽量单独占一行 xff0c 每条语句都要以分号结束 xff1b 2 在声明变量时 xff0c 尽
  • Tensorflow2.5安装(安装问题,这一篇全解决)

    恭喜你发现全网最简单最详细的Tensorflow安装教程 xff01 本文将给出2 5版本的具体配置 xff0c 若要安装其他版本也可参照本文的思路 与过去版本对比 xff0c 你可以感受到来自Tensorflow2 5的善意 xff1a
  • linux嵌入式arm基础笔记5之录音与播放

    1 粤嵌GEC6818开发板介绍 http www gec lab com arm show 72 html 2 粤嵌GEC6818平台介绍及其开发板配置 操作系统 心若十年的博客 CSDN博客 https blog csdn net qq
  • C++应用之线程池ThreadPool

    include 34 ThreadPool h 34 include 34 StopWatch h 34 include lt thread gt include lt chrono gt include lt iostream gt vo
  • Centeros最小化安装后很多常用命令无法使用(一键安装linux常用命令)

    运行如下命令立即解决问题 最小化安装系统后还会有一些基本的工具没装 xff0c 可采用yum方式批量安装 xff0c 也可以使用哪个安装哪个 yum y install wget setuptool system config firewa
  • 【从零开始的SDN学习之路】之闲话Neutron与SDN的联系

    闲话Neutron与SDN的联系 前言一 OpenStack中的网络发展二 Neutron是不是SDN xff1f 前言 OpenStack作为当前最富盛名的云计算管理工具 xff0c 其服务覆盖了网络 虚拟化 操作系统 服务器等各个方面
  • ESP8266(ESP模块)Arduino开发环境快速搭建方法--含网盘离线文件

    目录 1 ESP8266简介 1 1 乐鑫ESP8266 1 2 安信可ESP模组 2 ESP8266开发 3 开发环境搭建 4 网盘文件离线安装 1 ESP8266简介 1 1 乐鑫ESP8266 乐鑫公司的提供的ESP8266 系列模组
  • 解决Ubuntu虚拟机地无法上网问题

    虚拟机软件 xff1a VMware xff0c 操作系统 xff1a Ubuntu20 04 1 笔者安装好Unbutu20 04 1的虚拟机之后一直遇到一个问题 xff0c 网络图标不显示 xff0c 网络也不可用 每次都要把 虚拟网络
  • python中wraps的详解

    1 name 用来显示函数的名称 xff0c doc 用来显示文档字符串也就是 34 34 文档字符串 34 34 这里面的内容 2 首先我们来看不加 64 wraps的例子 span class token keyword def spa
  • 读书笔记-深度学习推荐系统1-概述章节

    推荐系统充斥于互联网的各个角落 xff0c 听音乐 看视频 看新闻 购物 学习课程等等 1 1 推荐系统的作用 用户 xff1a 在信息过载的情况下 xff0c 帮助用户高效获得感兴趣的信息 公司 xff1a 通过推荐吸引用户留存 增加用户
  • C++算法之——常用算法总结

    基本的C 43 43 算法分为三类 xff1a 排序算法 树算法 图算法 算法思想有三种 xff1a 递推 分治 动态规划 以及 贪心算法 本文将简要介绍上面三类算法 xff0c 介绍时穿插介绍算法思想 一 排序算法 1 基本O n 2 排
  • xfs 文件系统的备份和恢复(包含磁盘挂载)

    一 xfs文件系统备份简介 XFS 提供了 xfsdump 和 xfsrestore 工具协助备份 XFS 文件系统中的数据 xfsdump 按 inode顺序备份一个 XFS 文件系统 centos7 开始选择 xfs 格式作为默认文件系
  • 正则的基本用法

    一 了解正则表达式 正则表达式是对字符串操作的一种逻辑公式 xff0c 就是用事先定义好的一些特定字符 及这些特定字符的组合 xff0c 组成一个 规则字符串 xff0c 这个 规则字符串 用来表达对字符串的一种过滤逻辑 正则表达式是用来匹
  • windows10 配置 VNC server

    windows10 配置 VNC server 配置 VNC server并设置 当客户端连接vnc server端时不能通过键盘和鼠标控制服务端 下载windows版 https www realvnc com en connect do
  • 二叉树的前序,中序,后序遍历

    前序遍历 xff1a 根节点 gt 左子树 gt 右子树 xff08 根 gt 左 gt 右 xff09 中序遍历 xff1a 左子树 gt 根节点 gt 右子树 xff08 左 gt 根 gt 右 xff09 后序遍历 xff1a 左子树