已知前序遍历和中序遍历求二叉树[通俗易懂]

已知前序遍历和中序遍历求二叉树[通俗易懂]描述输入某二叉树的前序遍历和中序遍历的结果,请输出后序遍历序列。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},重建二叉树并返回后序遍历序列输入输入某二叉树的前序遍历和中序遍历的结果输出输出后序遍历序列输入样例1 12473568…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

描述

输入某二叉树的前序遍历和中序遍历的结果,请输出后序遍历序列。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},重建二叉树并返回后序遍历序列

输入

输入某二叉树的前序遍历和中序遍历的结果

输出

输出后序遍历序列

输入样例 1 

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

输出样例 1

7 4 2 5 8 6 3 1

 题意:

前序遍历即先访问根节点,然后是左子树,右子树

中序遍历为先访问左子树,然后是根节点,右子树

所以通过前序遍历不断地找到根节点,然后中序遍历找到其左子树和右子树

已知前序遍历和中序遍历求二叉树[通俗易懂]

已知前序遍历和中序遍历求二叉树[通俗易懂]

已知前序遍历和中序遍历求二叉树[通俗易懂]

已知前序遍历和中序遍历求二叉树[通俗易懂]

已知前序遍历和中序遍历求二叉树[通俗易懂]

已知前序遍历和中序遍历求二叉树[通俗易懂]

最后就可以得到这棵二叉树,后序遍历即为 7 4 2 5 8 6 3 1

实现代码:

#include<stdio.h>
#include<stdlib.h> 
#include<string.h> 
typedef struct node* BinTree; 
struct node{
	int date;
	BinTree left;
	BinTree right;
};
BinTree Build(int pre[] ,int in[] ,int size)
{
	if(size<=0)return NULL;
	//先在中序中找到根节点
	int i;
	for(i=0;i<size;i++)
	{
		if(in[i]==pre[0])break;
	} 
	BinTree tree=(BinTree)malloc(sizeof(struct node));
	tree->date=pre[0];
	tree->left=Build(pre+1,in,i);
	tree->right=Build(pre+i+1,in+i+1,size-1-i);
	return tree;
} 
void postorder(BinTree T)  //后序遍历 
{
	if(T==NULL)return;
	else{
		postorder(T->left);
		postorder(T->right);
	    printf("%d ",T->date);
	}
	
} 
int main()
{
	char pree[800],inn[800];  
	gets(pree);
	gets(inn);  
	int size=strlen(pree);  
	int pre[800],in[800];
	int precount=0; 
	int i;
	for(i=0;i<size;i++)
	{
		if(i==0)
		{
			pre[precount]=pree[i]-'0';
		}
		else
		{
			if(pree[i]>='0'&&pree[i]<='9')
			{
				//此if-else 用来转换多位数为int类型 
				if(pree[i-1]==' ')  //如果前一个元素为空格 
				{
					precount++;
				    pre[precount]=pree[i]-'0';
				}
				
				else  //如果前一个元素不是空格,那么说明与前一个元素一同构成的数  例如:10 
				{
					pre[precount]=pre[precount]*10+(pree[i]-'0');
				}
			}
			
		}
		
	}
	int incount=0;
	for(i=0;i<size;i++)
	{
		if(i==0)
		{
			in[incount]=inn[i]-'0'; 
		}
		else
		{
			if(inn[i]>='0'&&inn[i]<='9')
			{
				if(inn[i-1]==' ')
				{
					incount++;
				    in[incount]=inn[i]-'0';
				}
				
				else
				{
					in[incount]=in[incount]*10+(inn[i]-'0');
				}
			}
			
		}
		
	}  
    //如果前序遍历的结点数与中序遍历的结点数相同且不为0,那么可以找到对应二叉树 
    if(precount==incount&&precount!=0)  
    {
    	BinTree T;
		T=Build(pre,in,precount+1);
		postorder(T);
	}
	
    
	return 0;
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195213.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 项目范围管理:项目范围管理的概念是什么_项目范围管理规划案例

    项目范围管理:项目范围管理的概念是什么_项目范围管理规划案例项目范围管理包括确保项目做且只做所需的全部工作,以成功完成项目的各个过程。 项目范围管理关注的焦点是:什么是包括在项目之内的,什么是不包括在项目之内的,即为项目工作明确划定边界。 对项目范围管理和控制的有效性,是衡量项目是否达到成功的一个必要标准,项目范围的管理不仅仅是项目整体管理的一个主要部分,同时在项目中不断地重申项目工作范围,有利于项目不偏离轨道,是项目中实施控制管理的一个主要手段。 项目范围是项目其他各方面管理的基础。如果范围都弄不清楚,成本、进度和质量等就无从谈起。确认项目范围对项目管理有如

    2022年9月22日
    2
  • python环境搭建和pycharm的安装配置及汉化(零基础小白版)[通俗易懂]

    python环境搭建和pycharm的安装配置及汉化(零基础小白版)[通俗易懂]前言:写这篇文章主要是介绍一下python的环境搭建和pycharm的安装配置,适合零基础的同学观看。这篇文章你会学到python的环境搭建和python比较好用的IDEpycharm的安装与基础配置。运行环境:window64位操作系统。没想到这么多的人看这篇文章,并且接连不断给我发邮箱,问问题,这篇文章不是用markdown写的,不好改,我重新写了一份,放在我的博客里面,这里是地址…

    2022年5月26日
    52
  • 基因调控网络 (Gene Regulatory Network) 01

    基因调控网络 (Gene Regulatory Network) 01本文为入门级的基因调控网络文章,主要介绍一些基本概念及常见的GRN模型。概念:基因调控网络(GeneRegulatoryNetwork,GRN),简称调控网络,指细胞内或一个基因组内基因和基

    2022年7月3日
    23
  • idea 激活码【中文破解版】

    (idea 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月22日
    44
  • redis缓存雪崩 缓存穿透 缓存击穿如何解决_缓存击穿问题

    redis缓存雪崩 缓存穿透 缓存击穿如何解决_缓存击穿问题文章目录缓存穿透缓存击穿缓存雪崩缓存穿透数据库中没有这个数据,内存中也没有这个数据简单场景public class demoController { public R selectOrderById(int id){ Object redisObj = ValueOperations.get(Strubg.valueof(id)); if(redisObj != null){ return new R().setCode(200).

    2022年8月8日
    4
  • android viewpager实现轮播「建议收藏」

    android viewpager实现轮播「建议收藏」本文是基于ViewPager实现的无限自动轮播banner分为三步:第一部分是有限手动轮播;第二部分是无限轮播;第三部分是自动轮播;第四部分是指示器适配有限手动轮播实现:布局:<androidx.viewpager.widget.ViewPagerandroid:id=”@+id/banner”android:layout_width=”match_parent”android:layout_height=”wrap_content”andro

    2022年7月22日
    11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号