已知满二叉树先序序列如何求后序序列
如题 自用笔记 如有错误欢迎及时指正
面对仅仅知道先序序列(DLR)求后序序列(LRD),首先想到的是不可能,若对一般的二叉树而言确实无法做到,但是满二叉树的特殊性使得该命题成立!下面给出本文所用例子。
思路:满二叉树左右子树结点个数相同且总节点数为奇数个, 只要能确定根节点就可以确定LRD序列,而DLR序列可以让我们知道根节点。采用递归方法完成该问题。
递归模型:
设DLR序列存在pre[l1...h1]中 LRD序列求出后保存到post[l2...h2]中,由先序序列第一个结点是根节点,可以定位后序序列中最后一个结点(根节点),剩下部分对半划分,递归进入。
case1.
f(pre[],l1,h1,post[],l2,h2) 无操作 l1>h1或l2>h2时
case2.
f(pre[],l1,h1,post[],l2,h2) post[h2]=pre[l1] 其他情况时
1.划分,求出pre[l1...h1]的中间元素,定出左右子树
half=(h1-l1)/2
2.先序序列pre[l1...h1]中左子树为pre[l1+1...l1+half],
将其放入后序序列post[l2...h2]中左子树部分post[l2...l2+half-1]中
f(pre[],l1+1,l1+half,post[],l2,l2+half-1)
3.先序序列pre[l1...h1]中右子树为pre[half+l1+1...h1],
将其放入后序序列post[l2...h2]中右子树部分post[l2+half...h2-1]中。
f(pre[],half+l1+1,h1,post[],l2+half,h2-1)
可运行代码
#include<stdio.h>
typedef int DataType;void DLRtoLRD(DataType pre[],int l1,int h1,DataType post[],int l2,int h2){int half; //pre保存先序序列 l1...h1为下标范围,post同理;half用于划分先序序列下左右子树;if(l1>h1){return;}else{post[h2] = pre[l1]; //将先序序列的元素放入后序序列对应位置,首次运行时体现为先序序列首节点(根节点)位置放入后续序列尾节点(根节点)位置half = (h1 - l1) / 2;DLRtoLRD(pre,l1+1,l1+half,post,l2,l2+half-1);DLRtoLRD(pre,half+l1+1,h1,post,l2+half,h2-1);}
}//DLRtoLRDvoid print(DataType print[], int len_print)
{ //输出函数for (int k = 0; k < len_print; k++){printf("%d ", print[k]);}printf("\n");
}int main(){DataType pre[7] = {1,2,4,5,3,6,7}; //先序序列DataType post[7]={0};printf("先序序列:");print(pre, 7);DLRtoLRD(pre, 0, 6, post, 0, 6);printf("后序序列:");print(post, 7);return 0;
}
以上
2021.10.17
00:15
已知满二叉树先序序列如何求后序序列相关推荐
- PAT甲级1020变体:已知二叉树层序+中序序列,求后序遍历序列
PAT甲级1020变体:已知二叉树层序+中序序列,求后序遍历序列 题目 输入格式 输出格式 输入样例 输出样例 代码 题目 已知二叉树层序+中序序列,求后序遍历序列. 输入格式 第一行给出该二叉树的节 ...
- C++实现已知二叉树前序遍历和中序遍历,求后序遍历
C++实现已知二叉树前序遍历和中序遍历,求后序遍历 一.基本概念 1.先序遍历(NLR)可以确定二叉树的父子结点: 2.中序遍历(LNR)可以确定二叉树的左右子树: 3.后序遍历(LRN)可以确定二叉 ...
- 已知满二叉树先序序列存在于数组中,设计算法将其变成后序序列
解题思路: 满二叉树:除最后一层无任何子结点外,每一层上的所有结点都有两个以上的结点 先序序列:DLR 后序序列:LRD 先从最简单的满二叉树开始: 1.只有一个结点的满二叉树 2.有三个结点的满二叉 ...
- 已知二叉树先序序列和中序序列,求后序序列
回答了百度知道上的一个提问,原题是这样的: 当一棵二叉树前序序列和中序序列分别为HGEDBFCA和EGBDHFAC时,其后序序列为什么?当一棵二叉树前序序列和中序序列分别为HGEDBFCA和EGBDH ...
- 给定二叉树先序、中序遍历序列,求后序遍历
给定一个二叉树的前序遍历和中序遍历的序列,输出对应这个二叉树的后续遍历序列. 输入描述: 输入为一行. 两个字符串,分别表示二叉树的前序遍历和中序遍历结果,用空格分隔.保证数据合法 输出描述: 对应输 ...
- 给出中序和前序求后序Java,已知二叉樹前序,中序遍歷,求后序遍歷,java實現...
簡單介紹一下思想,先看前序,前序遍歷的第一個節點,就是該樹的根.在中序中找到該根的位置,設為index,在中序遍歷集合中,位於index之前的屬於根的左子樹,位於index之后的屬於根的右子樹.然后, ...
- POJ 2255 Tree Recovery(已知前序中序,求后序)
1. 题目链接:http://poj.org/problem?id=2255 2. 题目大意: 给定二叉树的前序和中序序列,输出其后序序列 3. 思考过程: 4. AC代码 /*** @descrip ...
- 二叉树知道前序和中序求后序,知道中序后序求中序
今天来总结下二叉树前序.中序.后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明. 首先,我们看 ...
- 数据结构----二叉树已知先序和中序遍历序列求后序遍历
说明 通过先序和中序或者中序和后序我们可以还原出原始二叉树,但是通过先序和后序是无法还原出原始二叉树也即是说,只有通过先序和中序,或者中序和后序我们才可以唯一的确定一个二叉树. 例子一 已知先序和中序 ...
最新文章
- 进行直播间搭建时需要注意的小细节
- LOJ#6281. 数列分块入门 5
- linux 内核线程与普通进程的区别
- Linux网络编程小知识(字节序、IP格式、函数、子网掩码、DNS域名解析代码实现)
- php 获取京东交易账号,PHP爬虫爬取京东列表
- 做自媒体和有没有文化没有太大关系
- 即使在微软 Azure 上,Linux 也大有一统天下之势!
- iOS开发之$ pod setup时,CocoaPods报CocoaPods was not able to update the `master` repo.
- 实体框架 6.0:异步、IQueryable操作符和特性改进
- django开发个人博客系统
- 【数学建模之Python】13.手撕抛物型方程的差分解法(如一维热传导方程)
- 实战演习(四)——网络流量系统分析简介
- 6410裸机加载linux内核,KG—Tiny6410裸机环境搭建(补充篇)
- css实现白光划过效果
- gmail邮件分组_如何使用Gmail和G Suite设置专业电子邮件地址
- 扩增子图表解读4曼哈顿图:差异OTU或Taxonomy
- HyperLynx(三十)高速串行总线仿真(二)
- 硬盘开启NCQ功能全解
- 如何找靠谱的游戏开发外包公司
- Zip、Rar文件解压
热门文章
- 大一暑假实习day5_3
- 亚马逊官方选品工具——“入驻卖家产品指南”使用方法-跨境知道
- 服务器安装MATLAB
- MiniUI的多表整合crud
- vs用c语言mci播放失败,C#使用mci播放MP3格式音乐文件解决方案
- oracle set nls_lang,Oracle 设置环境变量NLS_LANG(客户端的环境变量)
- windows系统里面搜索文件内容
- 科技的产品玩具化,随处可画的3D打印笔,玩转新科技
- sql tunning link
- 极验验证码(6.0.9)破解(二) 之 反混淆