如题 自用笔记 如有错误欢迎及时指正

面对仅仅知道先序序列(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

已知满二叉树先序序列如何求后序序列相关推荐

  1. PAT甲级1020变体:已知二叉树层序+中序序列,求后序遍历序列

    PAT甲级1020变体:已知二叉树层序+中序序列,求后序遍历序列 题目 输入格式 输出格式 输入样例 输出样例 代码 题目 已知二叉树层序+中序序列,求后序遍历序列. 输入格式 第一行给出该二叉树的节 ...

  2. C++实现已知二叉树前序遍历和中序遍历,求后序遍历

    C++实现已知二叉树前序遍历和中序遍历,求后序遍历 一.基本概念 1.先序遍历(NLR)可以确定二叉树的父子结点: 2.中序遍历(LNR)可以确定二叉树的左右子树: 3.后序遍历(LRN)可以确定二叉 ...

  3. 已知满二叉树先序序列存在于数组中,设计算法将其变成后序序列

    解题思路: 满二叉树:除最后一层无任何子结点外,每一层上的所有结点都有两个以上的结点 先序序列:DLR 后序序列:LRD 先从最简单的满二叉树开始: 1.只有一个结点的满二叉树 2.有三个结点的满二叉 ...

  4. 已知二叉树先序序列和中序序列,求后序序列

    回答了百度知道上的一个提问,原题是这样的: 当一棵二叉树前序序列和中序序列分别为HGEDBFCA和EGBDHFAC时,其后序序列为什么?当一棵二叉树前序序列和中序序列分别为HGEDBFCA和EGBDH ...

  5. 给定二叉树先序、中序遍历序列,求后序遍历

    给定一个二叉树的前序遍历和中序遍历的序列,输出对应这个二叉树的后续遍历序列. 输入描述: 输入为一行. 两个字符串,分别表示二叉树的前序遍历和中序遍历结果,用空格分隔.保证数据合法 输出描述: 对应输 ...

  6. 给出中序和前序求后序Java,已知二叉樹前序,中序遍歷,求后序遍歷,java實現...

    簡單介紹一下思想,先看前序,前序遍歷的第一個節點,就是該樹的根.在中序中找到該根的位置,設為index,在中序遍歷集合中,位於index之前的屬於根的左子樹,位於index之后的屬於根的右子樹.然后, ...

  7. POJ 2255 Tree Recovery(已知前序中序,求后序)

    1. 题目链接:http://poj.org/problem?id=2255 2. 题目大意: 给定二叉树的前序和中序序列,输出其后序序列 3. 思考过程: 4. AC代码 /*** @descrip ...

  8. 二叉树知道前序和中序求后序,知道中序后序求中序

    今天来总结下二叉树前序.中序.后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明. 首先,我们看 ...

  9. 数据结构----二叉树已知先序和中序遍历序列求后序遍历

    说明 通过先序和中序或者中序和后序我们可以还原出原始二叉树,但是通过先序和后序是无法还原出原始二叉树也即是说,只有通过先序和中序,或者中序和后序我们才可以唯一的确定一个二叉树. 例子一 已知先序和中序 ...

最新文章

  1. 进行直播间搭建时需要注意的小细节
  2. LOJ#6281. 数列分块入门 5
  3. linux 内核线程与普通进程的区别
  4. Linux网络编程小知识(字节序、IP格式、函数、子网掩码、DNS域名解析代码实现)
  5. php 获取京东交易账号,PHP爬虫爬取京东列表
  6. 做自媒体和有没有文化没有太大关系
  7. 即使在微软 Azure 上,Linux 也大有一统天下之势!
  8. iOS开发之$ pod setup时,CocoaPods报CocoaPods was not able to update the `master` repo.
  9. 实体框架 6.0:异步、IQueryable操作符和特性改进
  10. django开发个人博客系统
  11. 【数学建模之Python】13.手撕抛物型方程的差分解法(如一维热传导方程)
  12. 实战演习(四)——网络流量系统分析简介
  13. 6410裸机加载linux内核,KG—Tiny6410裸机环境搭建(补充篇)
  14. css实现白光划过效果
  15. gmail邮件分组_如何使用Gmail和G Suite设置专业电子邮件地址
  16. 扩增子图表解读4曼哈顿图:差异OTU或Taxonomy
  17. HyperLynx(三十)高速串行总线仿真(二)
  18. 硬盘开启NCQ功能全解
  19. 如何找靠谱的游戏开发外包公司
  20. Zip、Rar文件解压

热门文章

  1. 大一暑假实习day5_3
  2. 亚马逊官方选品工具——“入驻卖家产品指南”使用方法-跨境知道
  3. 服务器安装MATLAB
  4. MiniUI的多表整合crud
  5. vs用c语言mci播放失败,C#使用mci播放MP3格式音乐文件解决方案
  6. oracle set nls_lang,Oracle 设置环境变量NLS_LANG(客户端的环境变量)
  7. windows系统里面搜索文件内容
  8. 科技的产品玩具化,随处可画的3D打印笔,玩转新科技
  9. sql tunning link
  10. 极验验证码(6.0.9)破解(二) 之 反混淆