算法训练 求先序排列  
时间限制:1.0s   内存限制:256.0MB
      
锦囊1
  后序的最后一个字母为根结点。
 
问题描述
  给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。
输入格式
  两行,每行一个字符串,分别表示中序和后序排列
输出格式
  一个字符串,表示所求先序排列

  样例输入
  BADC
  BDCA

样例输出
ABCD
 
作者注释:解此题,狠狠的复习了一把先、中、后序遍历二叉树。针对此题的笔记如下:
 
先序、中序、后序分别用pre、in、last数组表示。
  1、后序的最后一个节点必为根节点;
  2、在中序里由根节点可划分左右子树;
  3、根节点就是要往先序中填充的节点;
  4、递归左右子树。
 
递归体的四个参数:
  instart:中序起始位置;
  insend:中序终止位置;
  lastroot:后序根节点(即后序最后一个节点);
  preindex:欲填充的先序位置。
 
在中序中:
  左子树根节点 = 上一个后序根节点 - 右子树长度;
  右子树根节点 = 上一个后序根节点 - 1.
 
左子树根节点:
  lastroot - [(inend - i) + 1];
右子树根节点:
  lastroot - 1;
左子树的根节点插入先序中的位置:
  preindex + 1;
右子树的根节点插入先序中的位置:
  [(i - instart) + 1] + preindex;(其中i为中序中根节点的下标);
 
递归体:
  对于左子树:dfs(instart, i - 1, lastroot - [(inend - i) + 1], preindex + 1);
  对于右子树:dfs(i + 1, inend, lastroot - 1, preindex + [(i - instart) + 1]);
 
代码:
 /*
DEABFCHG
DEAFHGCB
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char pre[],in[],last[];//数组规模比预算稍微设置大一点
void dfs(int instart,int inend,int lastroot,int preindex){
if(instart>inend) return;//出口
for(int i=instart;i<=inend;i++){
if(in[i] == last[lastroot]){
pre[preindex] = in[i];
dfs(instart,i-,lastroot-(inend-i)-,preindex+);//左子树
dfs(i+,inend,lastroot-,preindex+(i-instart)+);//右子树
return;
}
}
}
int main(){
scanf("%s",&in);//录入中序,后序
getchar();//处理回车
scanf("%s",&last);
int leni = strlen(in);
int lenl = strlen(last);
dfs(,leni-,lenl-,);
printf("%s",pre);
return ;
}

C语言 · 求先序遍历的更多相关文章

  1. luogu 1030 求先序遍历

    此题给出中序遍历和后序遍历后的序列,乍一看确乎想不出法子解决,毕竟是逆向思维: 但是后序遍历的特殊性质 son1,son2,x 使得后序的末尾便是根节点,再由中序天然的递归性质便可递归输出,用下fin ...

  2. 二叉树的遍历 &【NOIP2001普及组】& 洛谷 P1030 求先序排列

    题目链接 https://www.luogu.org/problemnew/show/P1030 模板题 先讲一下二叉树的遍历 二叉树的遍历 分类 性质 求法 分为三类: 先序遍历(PreOrder) ...

  3. 洛谷 P1030 求先序排列 Label:None

    题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序 ...

  4. 洛谷:P1087 FBI树 P1030 求先序排列 P1305 新二叉树

    至于为啥把这三个题放到一起,大概是因为洛谷的试炼场吧,三道树的水题,首先要理解 先序中序后序遍历方法. fbi树由于数量小,在递归每个区间时,暴力跑一遍区间里的数,看看是否有0和1.至于递归的方法,二 ...

  5. 用c语言实现前序创建二叉树(递归),分别用前序,中序,后序遍历,以及分别输出节点个数和叶子节点个数

    本人c语言小白一枚,近期在学习数据结构(c语言版),特写此随笔,做一些总结和分享,如有不当之处,请各位技术大牛斧正 首先我们用一个结构体来抽象树的结点,代码如下(这里我们存放的数据为char型,大家可 ...

  6. Go语言实现:【剑指offer】二叉搜索树的后序遍历序列

    该题目来源于牛客网<剑指offer>专题. 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. Go ...

  7. codevs 1013 求先序排列(二叉树遍历)

    传送门 Description 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). Input 两个字符串,分别是中序和后序(每行一个) Outp ...

  8. 二叉树中序遍历 (C语言实现)

    在计算机科学中,树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构.二叉树是每个节点最多有两个子树的有序树.通常子树被称作“左子树”(left subtre ...

  9. 二叉树后序遍历的非递归算法(C语言)

    首先非常感谢‘hicjiajia’的博文:二叉树后序遍历(非递归) 这篇随笔开启我的博客进程,成为万千程序员中的一员,坚持走到更远! 折磨了我一下午的后序遍历中午得到解决,关键在于标记右子树是否被访问 ...

随机推荐

  1. jquery利用正则表达式验证密码,手机号(主要是使用方法,正则表达式网上一搜一堆)

    var mobile = $("#UserMobile").val(); if (mobile != "") { }-\d{}|\d{}-\d{,})|([|| ...

  2. css的基本定位机制

    分为三种:普通流.浮动.绝对定位 普通流:默认,html文档的排列顺序块级从上到下(垂直距离由margin-top.margin-bottom决定):行内元素在一行中从左到右(由margin-left ...

  3. CODEVS 1074 食物链 2001年NOI全国竞赛(洛谷 P2024)

    题目描述 Description 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A吃B,B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并 ...

  4. [USACO07NOV]牛栏Cow Hurdles

    OJ题号:洛谷2888 思路:修改Floyd,把边权和改为边权最大值.另外注意是有向图. #include<cstdio> #include<algorithm> using ...

  5. MySql中drop、truncate、delete的区别

    1.drop:能对table和view 用法:  drop table [is exists] 表1,表2,表3....: ①drop是DDL中删除表的操作,会删除表结构和所有数据,并释放空间. ②并 ...

  6. Expedition [POJ2431] [贪心]

    题目大意: 有n个加油站,每个加油站的加油的油量有限,距离终点都有一个距离. 一个卡车的油箱无限,每走一个单元要消耗一单元的油,问卡车到达终点的最少加多少次油. 分析: 我们希望的是走到没油的时候就尽 ...

  7. php curl数据传输神器

    一.curl的概念: curl (Client Url Library Functions) 定义: curl is a command  line tool for transfering data ...

  8. 通过echarts的demo

    通过最近两天对echarts的了解,下面用echarts.js写了一个小效果: 效果的demo为: <!DOCTYPE html> <html lang="en" ...

  9. C# 计算地图上某个坐标点的是否在多边形内

    这个方法引用自群友的博客 https://www.xiaofengyu.com/?p=143 使用百度地图的时候,常常会用到判断一个点是否在一个多边形的范围内,该方法用到的是射线法, 通过修改Java ...

  10. UVALive - 4885 Task 差分约束

    Task 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page ...