C语言 · 求先序遍历

算法训练 求先序排列

时间限制: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]);

代码:

 1 /*
 2 DEABFCHG
 3 DEAFHGCB
 4 */
 5 #include<stdio.h>
 6 #include<string.h>
 7 #include<stdlib.h>
 8 char pre[10],in[10],last[10];//数组规模比预算稍微设置大一点
 9 void dfs(int instart,int inend,int lastroot,int preindex){
10     if(instart>inend) return;//出口
11     for(int i=instart;i<=inend;i++){
12         if(in[i] == last[lastroot]){
13             pre[preindex] = in[i];
14             dfs(instart,i-1,lastroot-(inend-i)-1,preindex+1);//左子树
15             dfs(i+1,inend,lastroot-1,preindex+(i-instart)+1);//右子树
16             return;
17         }
18     }
19 }
20 int main(){
21     scanf("%s",&in);//录入中序,后序
22     getchar();//处理回车
23     scanf("%s",&last);
24     int leni = strlen(in);
25     int lenl = strlen(last);
26     dfs(0,leni-1,lenl-1,0);
27     printf("%s",pre);
28     return 0;
29 }
时间: 2024-10-06 21:18:01

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

二叉树系列(二):已知中序遍历序列和后序遍历序列,求先序遍历序列

前面已经介绍过三种遍历方法的规则,为了大家看着方便,这里我们在重新介绍一遍: 1.先序遍历 (1)访问根结点: (2)先序遍历左子树: (3)先序遍历右子树.  2.中序遍历 (1)中序遍历左子树: (2)访问根结点: (3)中序遍历右子树. 3.后序遍历 (1)后序遍历左子树: (2)后序遍历右子树: (3)访问根结点. 知道了二叉树的三种遍历规则,只要有中序遍历序列和前后任一种遍历序列,我们就可以求出第三种遍历序列,今天我们研究的是已知中序和后序遍历序列,求先序遍历序列. 已知该二叉树的中序

南阳OJ-756 重建二叉树(二叉树的中序遍历和后序遍历求先序遍历)

重建二叉树 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!). 输入 输入有多组数据(少于100组),以文件结尾结束.每组数据仅一行,包括两个字符串,中间用空格隔开,分别表示二叉树的后序和中序序列(字符串长度小于26,输入数据保证合法). 输出 每组输出数据单独占一行,输出对应得先序序列. 样例输入 ACBFGED ABCDEFG CDAB CBAD 样例输出 DBACEGF BCAD二

已知二叉树的中序遍历和后序遍历,求先序遍历

可以跟之前这篇形成对比 http://blog.csdn.net/hhooong/article/details/43195395 代码如下: #include<iostream> #include<string> using namespace std ; struct BinTreeNode { char data ; BinTreeNode *left ; BinTreeNode *right ; }; void BinTreeSuccess(char* post,char*

二叉树系列(一):已知先序遍历序列和中序遍历序列,求后序遍历序列

首先介绍一下三种遍历顺序的操作方法: 1.先序遍历 (1)访问根结点: (2)先序遍历左子树: (3)先序遍历右子树.  2.中序遍历 (1)中序遍历左子树: (2)访问根结点: (3)中序遍历右子树. 3.后序遍历 (1)后序遍历左子树: (2)后序遍历右子树: (3)访问根结点. 知道了二叉树的三种遍历规则,只要有中序遍历序列和前后任一种遍历序列,我们就可以求出第三种遍历序列,今天我们研究的是已知先序和中序遍历序列,求后序遍历序列. 已知该二叉树的先序遍历序列为:A-B-D-E-G-C-F,

洛谷 P1030 求先序排列 Label:None

题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列. 输出格式: 1行,表示一棵二叉树的先序. 输入输出样例 输入样例#1: BADC BDCA 输出样例#1: ABCD 代码 1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #inclu

luogu1030 求先序排列

https://www.luogu.org/problemnew/show/1030 题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列. 输出格式: 1行,表示一棵二叉树的先序. 输入输出样例 输入样例#1: BADC BDCA 输出样例#1: ABCD 1 #include<cstdio> 2 #include<string>

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

在计算机科学中,树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构.二叉树是每个节点最多有两个子树的有序树.通常子树被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用于实现二叉查找树和二叉堆. 如下是实现创建二叉树和二叉树中序遍历的代码: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <memory.h> 4 5 t

c语言实现 非递归先序遍历二叉链树

1 #include<stdio.h> 2 #include<conio.h> 3 #include<malloc.h> 4 typedef char datatype; 5 typedef struct node{ 6 datatype data; 7 struct node *lchild,*rchild; 8 }bitree; //二叉链树数据结构定义 9 void Preorder(bitree *p) //先序遍历算法 10 { 11 bitree *Stac

C语言 二叉树顺序存储结构的先序遍历算法

#include <stdio.h> #include <stdlib.h> #include <string.h> #define __MAX_LENGTH__ 20 typedef struct SqStack{//调用栈     int data[__MAX_LENGTH__];     int top; }SqStack; typedef struct SqBiTree{//顺序存储二叉树     elemType data[__MAX_LENGTH__];