算法训练 求先序排列  
时间限制: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. 一个用SAM维护多个串的根号特技

    一个用SAM维护多个串的根号特技 基本介绍 在多个串的字符串题中,往往会出现一类题需要用到某个子串是否在一些母串中出现.此时对于 \(\text{parent}\) 树的 \(\text{right} ...

  2. Codeforces.1051G.Distinctification(线段树合并 并查集)

    题目链接 \(Description\) 给定\(n\)个数对\(A_i,B_i\).你可以进行任意次以下两种操作: 选择一个位置\(i\),令\(A_i=A_i+1\),花费\(B_i\).必须存在 ...

  3. Codeforces.1110E.Magic Stones(思路 差分)

    题目链接 听dalao说很nb,做做看(然而不小心知道题解了). \(Description\) 给定长为\(n\)的序列\(A_i\)和\(B_i\).你可以进行任意多次操作,每次操作任选一个\(i ...

  4. Codeforces.348D.Turtles(容斥 LGV定理 DP)

    题目链接 \(Description\) 给定\(n*m\)的网格,有些格子不能走.求有多少种从\((1,1)\)走到\((n,m)\)的两条不相交路径. \(n,m\leq 3000\). \(So ...

  5. window下安装PIL

    PIL非官方库64 友情连接: https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/ ...

  6. docker -v挂载

    docker run -d -p 3306:3306 -v /var/lib/mydata:/var/lib/mysql  my_sql docker exec -it mys_sql /bin/ba ...

  7. Sublime Text3 最新版本V3.1.1 build3117注册码,亲测可以完美激活~

    Sublime Text 3 最新注册码 官网下载的最新版本V3.1.1 build3117,亲测以下注册码可以正常激活 ----- BEGIN LICENSE ----- sgbteam Singl ...

  8. BZOJ2319 : 黑白棋游戏

    将01串按1分段,那么分析可得长度为$a$的段拼上长度为$b$的段的SG值为$a-[a\leq b]$. 设$f[i][j][k][l]$表示从后往前用了$i$个1,$j$个0,当前段长度为$k$,后 ...

  9. IIS 日志分析工具:Log Parser Studio

    1.安装Log Parser,下载地址:http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=24659 ...

  10. PAT-Top1001. Battle Over Cities - Hard Version (35)

    在敌人占领之前由城市和公路构成的图是连通图.在敌人占领某个城市之后所有通往这个城市的公路就会被破坏,接下来可能需要修复一些其他被毁坏的公路使得剩下的城市能够互通.修复的代价越大,意味着这个城市越重要. ...