7-1 根据后序和中序遍历输出先序遍历 (PTA-数据结构)

这篇具有很好参考价值的文章主要介绍了7-1 根据后序和中序遍历输出先序遍历 (PTA-数据结构)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。

输入格式:

第一行给出正整数N(≤30),是树中结点的个数。随后两行,每行给出N个整数,分别对应后序遍历和中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉树。

输出格式:

在一行中输出Preorder: 以及该树的先序遍历结果。数字间有1个空格,行末不得有多余空格。

输入样例:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

输出样例:

Preorder: 4 1 3 2 6 5 7

通过截图:

本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果,数据结构,PTA,数据结构,算法,c语言 


 思路分析:

        起初看到后序遍历和中序遍历,第一想法是用这个数组创建一棵树,但是考虑到我之前写过的创建树的代码不接受这样的输入(以前的问题),因此开始考虑能不能通过我们人类的思维方式,来想一个能用后序和中序推出先序的算法(相信三者转换是有规律的,因为我们做那种简答题或者选择题,也是按照一定规律推到树,然后写出来的)。

        例如:本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果,数据结构,PTA,数据结构,算法,c语言


       要知道,后序(Post)遍历是LRV,中序(Min)遍历是LVR,先序(Pre)遍历是VLR(V 根节点,L 左子树结点,R 右子树结点)。下面写一下该题的图示:

本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果,数据结构,PTA,数据结构,算法,c语言

        其中,我们不难发现, Post的最后一个字符是根节点(Post的最后一个,Pre的第一个),该结点下面的左子树的根节点是第二个我们要输出的,以此类推。

人类手绘创建的树如下:

本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果,数据结构,PTA,数据结构,算法,c语言

        我们在手绘树的时候,发现,在中序遍历数组中所找到根节点,左边的是左子树,右边的是右子树,即  (1((2)3))4((5)6(7)) 红色括号为右子树,深绿为左子树,准备好之后,明白我们要找到根(root),子树一个括号中的第一个元素位置(start),子树括号最后一个元素位置(fin)。

        树大概是比较推荐用递归来写,所以我选择了用递归来写,之后疯狂debug折磨自己。因为非递归的思路不是很清楚,我们下面决定用递归来写(之前文章内容就没写过非递归的遍历检查,所以这里行进困难),递归的思路是先序遍历寻找,找到本次操作的根节点后,在中序中寻找此结点,记录下此节点的下标位置,作为在左子树或是右子树的位置线索。

位置线索思考与整理:

        画图表,找到相关联的数字线索,做出数学公式,此处普适公式寻找比较困难,从特例开始(普朗克也是这样发现能量子的),此处思路参考了:已知后序与中序输出前序(先序) – 柳婼 の blog (liuchuo.net)https://www.liuchuo.net/archives/2090        此思路表格展示为【表头第一列为相对于其父母结点的位置,其后数字个数为所在层数+位置(左子树为1,右子树为2),root,start,fin上面已有赘述,i为root元素在中序遍历中的下标位置,n为此结点的值(最后两行是博主在写时没有列出来的,尤其是start和fin,因此博主有蒙对的嫌疑!!不过后来列表的时候居然完美吻合)】:

本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果,数据结构,PTA,数据结构,算法,c语言

         因此,经过观察和统计,整理(Main 0 -> Left 1,Right 1.2 -> Left 1.2.1)左子树的计算公式为 :本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果,数据结构,PTA,数据结构,算法,c语言 ,,;

        整理(Main 0 -> Right 2,Left 1 ->Right 1.2 )右子树的计算公式为:,,本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果,数据结构,PTA,数据结构,算法,c语言

        这样,我们就明白了整体流程(当然,博主是边想边写的,这块debug了好长时间) ,现在我们要将它写成代码。


 代码整理(递归):

//
// Created by DDD on 2023/11/20.
//
#include <stdio.h>

void makePre(int post[], int min[], int root, int fin, int start){
    if((fin <= start)||(root<0))
        return;
    int i;
    int head = post[root];

    for(i=start; i<fin;i++) {
        if (min[i] == head) {
            break;
        }
    }

    printf(" %d",head);            //此处处理了题目中输出要求
    makePre(post,min,root-fin+i,i,start);    //左子树
    makePre(post,min,root-1,fin,i+1);        //右子树
}

int main(){
    int num;
    scanf("%d",&num);
    int post[num];                      //后序
    int min[num];                       //中序
    for(int i=0; i<num;i++){
        scanf("%d",&post[i]);
    }
    for(int i=0; i<num;i++){
        scanf("%d",&min[i]);
    }
    printf("Preorder:");
    makePre(post,min,num - 1,num,0);
}

return 0;    //归去来文章来源地址https://www.toymoban.com/news/detail-773315.html

到了这里,关于7-1 根据后序和中序遍历输出先序遍历 (PTA-数据结构)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言实现非递归先序、中序、后序遍历

    闲来无事,回顾一下以前的学过的数据结构知识,面试也可以用到!!!    1、创建一颗二叉树 2、栈 3、非递归中序遍历 第一种 : 非递归中序遍历算法  第二种:非递归中序遍历算法 伪代码和算法详解: 4.非递归中序遍历完整代码 演示效果:    5.非递归先序遍历 第一种

    2024年02月07日
    浏览(34)
  • Java根据二叉树的先序和后序得到二叉树

    一般情况下,我们会根据先序和后序写出二叉树,但是用代码怎末写呢? 例如: 给定两个整数数组  preorder  和  inorder  ,其中  preorder  是二叉树的 先序遍历 ,  inorder  是同一棵树的 中序遍历 ,请构造二叉树并返回其根节点。 思路:我们先根据先序遍历找到根节点记录

    2024年01月19日
    浏览(36)
  • 数据结构——二叉树先序、中序、后序三种遍历

    先序遍历可以想象为,一个小人从一棵二叉树根节点为起点,沿着二叉树外沿,逆时针走一圈回到根节点,路上遇到的元素顺序,就是先序遍历的结果 先序遍历结果为:A B D H I E J C F K G 动画演示: 记住小人沿着外围跑一圈(直到跑回根节点),多看几次动图便能理解    

    2024年02月11日
    浏览(48)
  • 【数据结构】二叉树的创建和遍历(先序、中序、后序)

    最近一段时间学习了数据结构中二叉树的基本操作,包括二叉树的结构、二叉树的创建、递归先序中序后序遍历、非递归遍历等,想着把二叉树的相关知识和自己的见解放到网上来让网友看看是否正确,想和网友一起共同交流。 先了解一下二叉树的三个基本性质: 性质1:在

    2024年02月04日
    浏览(43)
  • 二叉树先序,中序,后序遍历的非递归算法(一)

    思路: 二叉树的前序遍历过程: 从树根开始沿着左子树一直深入,直到最左端无法深入时,返回; 进入最近深入时遇到结点的右子树,再进行如此的深入和返回; 直到最后从根节点的右子树返回到根节点为止; 由其深入返回的过程我们知道可以用一个栈来帮助我们消除递

    2023年04月14日
    浏览(78)
  • C语言完整代码实现:二叉树的先序遍历、中序遍历、后序遍历

    一、先序遍历原理        先序遍历就是: 根、左、右 ,也就是先遍历根结点再遍历左结点最后再遍历右结点,注意:如果遍历到的结点不是叶子结点的话需要对该结点进行拆分,比如这棵二叉树: 先遍历 A ,然后是 B ,然后再是 C ,但是由于B并不是叶子结点,他本身又是

    2024年02月07日
    浏览(47)
  • 二叉树的遍历(先序遍历,中序遍历,后序遍历)递归与非递归算法

    先序遍历:先遍历一颗树的根节点,后遍历左子树,最后遍历右子树     先序遍历序列: 1 - 2 - 4 - 5 - 3 - 6 - 7 分解子问题方法 思路:将一颗二叉树看做两个部分,一个部分是左路节点,另一个部分是左路节点的右子树,先将二叉树的左路节点全部入栈,再依次出栈,出栈的

    2024年02月14日
    浏览(37)
  • 【数据结构】16 二叉树的定义,性质,存储结构(以及先序、后序、中序遍历)

    一个二叉树是一个有穷的结点集合。 它是由根节点和称为其左子树和右子树的两个不相交的二叉树组成的。 二叉树可具有以下5种形态。 一个二叉树第i层的最大结点数为 2 i − 1 2^{i-1} 2 i − 1 , i ≥ 1 i geq 1 i ≥ 1 每层最大结点可以对应完美二叉树(满二叉树),其所有分支结

    2024年02月20日
    浏览(43)
  • 【树】建立二叉链表存储的二叉树+遍历二叉树(先序、中序、后序、层序)

    二叉树的构建利用了递归的原理,在按先序序列构建二叉树时,为了能让电脑知道每个结点是否有左右孩子,我们要对原二叉树进行 扩展 ,明确表示每个结点的左右孩子,若当前结点没有左右孩子,我们用’#\\\'表示。 由普通二叉树----扩展二叉树,如下图: 此时当我们按先序

    2024年02月07日
    浏览(38)
  • 数据结构——二叉树(先序、中序、后序及层次四种遍历(C语言版))超详细~ (✧∇✧) Q_Q

    目录     二叉树的定义: *特殊的二叉树:  二叉树的性质:  二叉树的声明:   二叉树的先序遍历:  二叉树的中序遍历:  二叉树的后序遍历: 二叉树的层序遍历:  二叉树的节点个数: 二叉树叶节点个数:   最后完整代码: 运行结果:  二叉树是n(n≥0)个结点的

    2024年02月01日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包