算法训练 求先序排列  
时间限制: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. MySQL中文排序

    按照汉字的拼音排序,用的比较多是在人名的排序中,按照姓氏的拼音字母,从A到Z排序: 如果存储姓名的字段采用的是GBK字符集,那就好办了,因为GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字37 ...

  2. SQL总结——存储过程

    SQL总结(五)存储过程 概念 存储过程(Stored Procedure):已预编译为一个可执行过程的一个或多个SQL语句. 创建存储过程语法 CREATE proc | procedure pro ...

  3. 轻松掌握Redux-Action使用方法

    轻松掌握Redux-Action使用方法 Redux-Action主要有两个方法,createAction和createAction,只要掌握了这两个方法就会了redux-action的使用. cre ...

  4. React-Redux使用方法

    React-Redux使用方法 理解 在React项目中使用react-redux,可以让你更方便的使用redux,原理是在index.js中注册app时用一个<Povider>标签嵌套, ...

  5. Charles通用破解激活办法

    Charles通用破解激活办法 适用于Charles任意版本的注册码,谁还会想要使用破解版呢. 目前最新版Charles 4.2.8. Registered Name: https://zhile.i ...

  6. [NOIP2018]摆渡车

    Description: 有 n 名同学要乘坐摆渡车从人大附中前往人民大学,第 i位同学在第 t 分钟去 等车.只有一辆摆渡车在工作,但摆渡车容量可以视为无限大.摆渡车从人大附中出发. 把车上的同学送 ...

  7. Vue(三)常用指令

    (1) v-model 双向数据绑定,一般用于表单元素 <script> window.onload=function(){ new Vue({ // el:'.itany', el:'d ...

  8. 微信小程序-添加手机联系人

    仅供参考 1,wxml: <view bindlongtap="phoneNumTap">{{phoneNum}}</view> 2,js: data = ...

  9. 挖矿病毒 qW3xT.2 最终解决方案

    转自:https://blog.csdn.net/hgx13467479678/article/details/82347473 1,cpu 100%, 用top 查看cpu100 2,删掉此进程 c ...

  10. 用distinct or array_unique

    在 Mysql 获取数据时,如果想获取某一列去重数据,如果获取呢 举个例子: advert_pro_ad 表 CREATE TABLE `advert_pro_ad` ( `advert_id` ) ...