二叉树遍历

所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。

从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:

⑴访问结点本身(N),

⑵遍历该结点的左子树(L),

⑶遍历该结点的右子树(R)。

以上三种操作有六种执行次序:

NLR、LNR、LRN、NRL、RNL、RLN。

注意:

前三种次序与后三种次序对称,故只讨论先左后右的前三种次序。

遍历命名

根据访问结点操作发生位置命名:

① NLR:前序遍历(Preorder Traversal 亦称(先序遍历))

——访问根结点的操作发生在遍历其左右子树之前。

② LNR:中序遍历(Inorder Traversal)

——访问根结点的操作发生在遍历其左右子树之中(间)。

③ LRN:后序遍历(Postorder Traversal)

——访问根结点的操作发生在遍历其左右子树之后。

注意:

由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。

给出某棵树的先序遍历结果和中序遍历结果(无重复值),求后序遍历结果。

比如

先序序列为:1,2,4,5,3,6,7,8,9

中序序列为:4,2,5,1,6,3,7,9,8

方法1:我们可以重建整棵树:

https://blog.csdn.net/hebtu666/article/details/84322113

建议好好看这个网址,对理解这个方法有帮助。

如图

然后后序遍历得出后序序列。

方法2:我们可以不用重建,直接得出:

过程:

1)根据当前先序数组,设置后序数组最右边的值

2)划分出左子树的先序、中序数组和右子树的先序、中序数组

3)对右子树重复同样的过程

4)对左子树重复同样的过程

原因:我们的后序遍历是左右中的,也就是先左子树,再右子树,再根

举个例子:

比如这是待填充序列:

我们确定了根,并且根据根和中序序列划分出了左右子树,黄色部分为左子树:

先处理右子树(其实左右中反过来就是中右左,顺着填就好了):

我们又确定了右子树的右子树为黑色区域,然后接着填右子树的右子树的根(N)即可。

举例说明:

a[]先序序列为:1,2,4,5,3,6,7,8,9

b[]中序序列为:4,2,5,1,6,3,7,9,8

c[]后序序列为:0,0,0,0,0,0,0,0,0(0代表未确定)

我们根据先序序列,知道根一定是1,所以后序序列:0,0,0,0,0,0,0,0,1

从b[]中找到1,并划分数组:

左子树的先序:2,4,5,

中序:4,2,5

右子树的先序:3,6,7,8,9,

中序:6,3,7,9,8

我们继续对右子树重复相同的过程:

(图示为当前操作的树,我们是不知道这棵树的样子的,我是为了方便叙述,图片表达一下当前处理的位置)

当前树的根一定为先序序列的第一个元素,3,所以我们知道后序序列:0,0,0,0,0,0,0,3,1

我们继续对左右子树进行划分,中序序列为6,3,7,9,8,我们在序列中找到2,并划分为左右子树:

左子树:

先序序列:6

中序序列:6

右子树:

先序序列:7,8,9

中序序列:7,9,8

我们继续对右子树重复相同的过程,也就是如图所示的这棵树:

现在我们的后序序列为0,0,0,0,0,0,0,3,1

这时我们继续取当前的根(先序第一个元素)放在下一个后序位置:0,0,0,0,0,0,7,3,1

划分左右子树:

左子树:空,也就是它

右子树:先序8,9,中序9,8,也就是这个树

我们继续处理右子树:先序序列为8,9,所以根为8,我们继续填后序数组0,0,0,0,0,8,7,3,1

然后划分左右子树:

左子树:先序:9,中序:9

右子树:空

对于左子树,一样,我们取头填后序数组0,0,0,0,9,8,7,3,1,然后发现左右子树都为空.

我们就把这个小框框处理完了

然后这棵树的右子树就处理完了,处理左子树,发现为空。这棵树也处理完了。

这一堆就完了。我们处理以3为根的二叉树的左子树。继续填后序数组:

0,0,0,6,9,8,7,3,1

整棵树的右子树处理完了,左子树同样重复这个过程。

最后4,5,2,6,9,8,7,3,1

好累啊。。。。。。挺简单个事写了这么多。

回忆一下过程:

1)根据当前先序数组,设置后序数组最右边的值

2)划分出左子树的先序、中序数组和右子树的先序、中序数组

3)对右子树重复同样的过程

4)对左子树重复同样的过程

就这么简单

先填右子树是为了数组连续填充,容易理解,先处理左子树也可以。

最后放上代码吧

a=[1,2,4,5,3,6,7,8,9]
b=[4,2,5,1,6,3,7,9,8]
l=[0,0,0,0,0,0,0,0,0]def f(pre,tin,x,y):#x,y为树在后序数组中对应的范围if pre==[]:returnl[y]=pre[0]#根pos=tin.index(pre[0])#左子树元素个数f(pre[pos+1:],tin[pos+1:],x+pos,y-1)#处理右子树f(pre[1:pos+1],tin[:pos],x,x+pos-1)#处理左子树f(a,b,0,len(l)-1)
print(l)

先序中序数组推后序数组相关推荐

  1. 通过先序和中序数组生成后续数组

    题目:已知一颗二叉树所有的节点值都不同,给定这颗树正确的先序和中序数组,不要重建整颗树,而是通过这两个数组直接生成正确的后续数组 def getPosArray(pre,mid):if pre == ...

  2. java根据前序和中序建树_(Java实现)二叉树---根据前序、中序、后序数组还原二叉树...

    概述在上一篇文章中讲到顺序存储二叉树,一般是用于完全二叉树,通过统一的数学公式可以将数组还原成完全二叉树 而对于普通的二叉树来说,也可以根据前序.中序和后序遍历得到的数组,还原二叉树 还原还原的情况分 ...

  3. 【数据结构笔记26】根据一棵树的先序/中序遍历Push与Pop内容,输出这棵树的先序、中序、后序遍历数组(不需要真的建立出树)

    本次笔记内容: 练习题-TTA.1 题意理解 练习题-TTA.2 核心算法 文章目录 题意理解 根据Push与Pop直接得出先序.中序数组 根据pre和in生成post C实现 题意理解 先来回忆非递 ...

  4. 二叉树前序后序中序互推总结

    最近笔试题一直遇到这个题,今天就总结一下.本文主要回答以下几个问题(Java实现): 前序 + 中序 => 后序 + 层序 后序 + 中序 => 前序 + 层序 以上2个问题的2种解决办法 ...

  5. Leetcode04--给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。

    文章目录 题目 一.归并算法 二.二分查找法 题目 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的中位数. 进阶:你能设计一个时间复杂度 ...

  6. 未能比较数组中的两个元素_算法3 寻找两个正序数组的中序数

    问题描述: 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的中位数.要求设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题. ...

  7. java打乱一组正序数字,Leetcode︱4.Median of Two Sorted Arrays寻找两个正序数组的中位数.java...

    题目 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的 中位数 . 示例 : 输入:nums1 = [1,3], nums2 = [2 ...

  8. C语言将数组中的值逆序存放

    C语言将数组中的值逆序存放 #include<stdio.h> #define N 5 int main(){int a[N], i, temp;printf("请输入一个数组: ...

  9. 数组中最大连续子序和

    求一个数组中最大连续子序和问题 1.贪心:如果前n项和相加小于零,则舍弃前n项,最后找到最大值 #include #include using namespace std; int main() { ...

最新文章

  1. docker 常用操作
  2. ora-00031:session marked for kill处理oracle中杀不掉的锁
  3. led显示屏p10参数设置_LED显示屏全彩P10的详细参数及说明
  4. Delphi中调用API函数经验点滴(二)
  5. 使用 Tye 辅助开发 dotnet 应用程序
  6. CUDA:使用nvprof工具计时
  7. mysql存储过程数组字符串_Mysql通过存储过程分割字符串为数组
  8. HTML+CSS实现弹跳球效果
  9. 6N+/-1素数测试法
  10. Spark函数讲解: combineByKey
  11. c/c++混编到的问题 extern C 介绍【转】
  12. 网站在微信中提示从浏览器打开
  13. C语言怎么实现熊猫上香中的系统错误提示,熊猫烧香的病毒是用什么程序语言编写的 原理是什么...
  14. bios 昂达h61c_Onda昂达主板BIOS,ONDA昂达H61N全固版(ver 3.00)主板BIOS 3.02版,主板BIOS,硬件驱动下载...
  15. Windows下删除文件夹提示找不到该项目,请确认该项目的位置,然后重试。
  16. matlab 摄氏度符号怎么打
  17. 如何恢复手机删除数据文件
  18. 如何成为一个iOS开发者
  19. Android 后台保活,这里有你需要的所有姿势。2019,最新版本。
  20. php 中文转义问题

热门文章

  1. b站电脑客户端_如何将B站的flv格式的视频转换成mp4格式
  2. php进入文件目录,php文件目录操作
  3. Linux修改开机启动logo
  4. cc、gcc、g++、CC的区别概括
  5. linux动态库与静态库混合连接
  6. 在飞音G801上运行OpenWRT+Asterisk
  7. VxWorks动态加载.out文件
  8. c语言判断闰年_C语言1博客作业06 - D丶千思
  9. android 安装第三方app,Android识别预装的第三方App方法实例
  10. grpc入门到精通_Spring Cloud 从入门到精通(一)Nacos 服务中心初探