先序中序数组推后序数组
二叉树遍历
所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。
从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:
⑴访问结点本身(N),
⑵遍历该结点的左子树(L),
⑶遍历该结点的右子树(R)。
以上三种操作有六种执行次序:
NLR、LNR、LRN、NRL、RNL、RLN。
注意:
前三种次序与后三种次序对称,故只讨论先左后右的前三种次序。
遍历命名
① NLR:前序遍历(Preorder Traversal 亦称(先序遍历))
③ LRN:后序遍历(Postorder Traversal)
给出某棵树的先序遍历结果和中序遍历结果(无重复值),求后序遍历结果。
方法1:我们可以重建整棵树:
https://blog.csdn.net/hebtu666/article/details/84322113
方法2:我们可以不用重建,直接得出:
原因:我们的后序遍历是左右中的,也就是先左子树,再右子树,再根
我们确定了根,并且根据根和中序序列划分出了左右子树,黄色部分为左子树:
我们又确定了右子树的右子树为黑色区域,然后接着填右子树的右子树的根(N)即可。
c[]后序序列为:0,0,0,0,0,0,0,0,0(0代表未确定)
我们根据先序序列,知道根一定是1,所以后序序列:0,0,0,0,0,0,0,0,1
(图示为当前操作的树,我们是不知道这棵树的样子的,我是为了方便叙述,图片表达一下当前处理的位置)
当前树的根一定为先序序列的第一个元素,3,所以我们知道后序序列:0,0,0,0,0,0,0,3,1
我们继续对左右子树进行划分,中序序列为6,3,7,9,8,我们在序列中找到2,并划分为左右子树:
这时我们继续取当前的根(先序第一个元素)放在下一个后序位置:0,0,0,0,0,0,7,3,1
我们继续处理右子树:先序序列为8,9,所以根为8,我们继续填后序数组0,0,0,0,0,8,7,3,1
对于左子树,一样,我们取头填后序数组0,0,0,0,9,8,7,3,1,然后发现左右子树都为空.
然后这棵树的右子树就处理完了,处理左子树,发现为空。这棵树也处理完了。
这一堆就完了。我们处理以3为根的二叉树的左子树。继续填后序数组:
先填右子树是为了数组连续填充,容易理解,先处理左子树也可以。
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)
先序中序数组推后序数组相关推荐
- 通过先序和中序数组生成后续数组
题目:已知一颗二叉树所有的节点值都不同,给定这颗树正确的先序和中序数组,不要重建整颗树,而是通过这两个数组直接生成正确的后续数组 def getPosArray(pre,mid):if pre == ...
- java根据前序和中序建树_(Java实现)二叉树---根据前序、中序、后序数组还原二叉树...
概述在上一篇文章中讲到顺序存储二叉树,一般是用于完全二叉树,通过统一的数学公式可以将数组还原成完全二叉树 而对于普通的二叉树来说,也可以根据前序.中序和后序遍历得到的数组,还原二叉树 还原还原的情况分 ...
- 【数据结构笔记26】根据一棵树的先序/中序遍历Push与Pop内容,输出这棵树的先序、中序、后序遍历数组(不需要真的建立出树)
本次笔记内容: 练习题-TTA.1 题意理解 练习题-TTA.2 核心算法 文章目录 题意理解 根据Push与Pop直接得出先序.中序数组 根据pre和in生成post C实现 题意理解 先来回忆非递 ...
- 二叉树前序后序中序互推总结
最近笔试题一直遇到这个题,今天就总结一下.本文主要回答以下几个问题(Java实现): 前序 + 中序 => 后序 + 层序 后序 + 中序 => 前序 + 层序 以上2个问题的2种解决办法 ...
- Leetcode04--给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。
文章目录 题目 一.归并算法 二.二分查找法 题目 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的中位数. 进阶:你能设计一个时间复杂度 ...
- 未能比较数组中的两个元素_算法3 寻找两个正序数组的中序数
问题描述: 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的中位数.要求设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题. ...
- java打乱一组正序数字,Leetcode︱4.Median of Two Sorted Arrays寻找两个正序数组的中位数.java...
题目 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的 中位数 . 示例 : 输入:nums1 = [1,3], nums2 = [2 ...
- C语言将数组中的值逆序存放
C语言将数组中的值逆序存放 #include<stdio.h> #define N 5 int main(){int a[N], i, temp;printf("请输入一个数组: ...
- 数组中最大连续子序和
求一个数组中最大连续子序和问题 1.贪心:如果前n项和相加小于零,则舍弃前n项,最后找到最大值 #include #include using namespace std; int main() { ...
最新文章
- docker 常用操作
- ora-00031:session marked for kill处理oracle中杀不掉的锁
- led显示屏p10参数设置_LED显示屏全彩P10的详细参数及说明
- Delphi中调用API函数经验点滴(二)
- 使用 Tye 辅助开发 dotnet 应用程序
- CUDA:使用nvprof工具计时
- mysql存储过程数组字符串_Mysql通过存储过程分割字符串为数组
- HTML+CSS实现弹跳球效果
- 6N+/-1素数测试法
- Spark函数讲解: combineByKey
- c/c++混编到的问题 extern C 介绍【转】
- 网站在微信中提示从浏览器打开
- C语言怎么实现熊猫上香中的系统错误提示,熊猫烧香的病毒是用什么程序语言编写的 原理是什么...
- bios 昂达h61c_Onda昂达主板BIOS,ONDA昂达H61N全固版(ver 3.00)主板BIOS 3.02版,主板BIOS,硬件驱动下载...
- Windows下删除文件夹提示找不到该项目,请确认该项目的位置,然后重试。
- matlab 摄氏度符号怎么打
- 如何恢复手机删除数据文件
- 如何成为一个iOS开发者
- Android 后台保活,这里有你需要的所有姿势。2019,最新版本。
- php 中文转义问题
热门文章
- b站电脑客户端_如何将B站的flv格式的视频转换成mp4格式
- php进入文件目录,php文件目录操作
- Linux修改开机启动logo
- cc、gcc、g++、CC的区别概括
- linux动态库与静态库混合连接
- 在飞音G801上运行OpenWRT+Asterisk
- VxWorks动态加载.out文件
- c语言判断闰年_C语言1博客作业06 - D丶千思
- android 安装第三方app,Android识别预装的第三方App方法实例
- grpc入门到精通_Spring Cloud 从入门到精通(一)Nacos 服务中心初探