【备战蓝桥杯】【递归】【C语言】【ALGO-20算法训练 求先序排列】
2018-03-12 00:29
597 查看
ALGO-20算法训练 求先序排列 时间限制:1.0s 内存限制:256.0MB关键字:递归问题描述 给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。输入格式 两行,每行一个字符串,分别表示中序和后序排列输出格式 一个字符串,表示所求先序排列样例输入BADC
BDCA样例输出ABCD分析首先我们要清楚的是,二叉树遍历的三种形式:
1.先(根)序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴ 访问根结点;
⑵ 遍历左子树;
⑶ 遍历右子树。
2.中(根)序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵访问根结点;
⑶遍历右子树。
3.后(根)序遍历得递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵遍历右子树;
⑶访问根结点。
参考代码:
举例
DBACEGF
中序z=ABCDEFG
后序h=ACBFGED
打印D-----在中序里找到D,a=ABC,b=ACB
递归-----打印B-----在中序里找到B,a=A,b=A
这里i=2
递归-----符合边界条件直接打印A---返回
在a=ABC,b=ACB里
接下来 a[0]=z[2]=C,即a=C
b[0]=h[1]=C,即b=C
递归----打印C
i=4,接下来a[0]=z[4]=E……a[6]=z[6]=G,即a=EFG
b[0]=h[3]=F……b[6]=h[5]=E,即b=FGE
递归-----打印E----在中序里找到E,a=空,b=空---返回
在a=EFG
b=FGE里
这里i=1
接下来a[0]=z[1]=F a[2]=z[2]=G,即a=FG
b[0]=h[0]=F b[2]=h[1]=G,即b=FG
递归2-----打印G------符合边界条件打印F
BDCA样例输出ABCD分析首先我们要清楚的是,二叉树遍历的三种形式:
1.先(根)序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴ 访问根结点;
⑵ 遍历左子树;
⑶ 遍历右子树。
2.中(根)序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵访问根结点;
⑶遍历右子树。
3.后(根)序遍历得递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵遍历右子树;
⑶访问根结点。
参考代码:
#include"stdio.h" #include"string.h" //BADC //BDCA void dg(char z[],char h[])//z中序,h后序 { //边界条件 if(strlen(h)==0)return; printf("%c",h[strlen(h)-1]);//找出后序最后一个,是根 if(strlen(h)==1)return;//后序只有一个,就是根已输出,则返回 if(strlen(h)==2)//后序只有一个,根已输出,再输出h[0] { printf("%c",h[0]); return; } char a[9],b[9]; int i,j; for(i=0;z[i]!=h[strlen(h)-1];i++)//在中序里找后序的最后一个,根 a[i]=z[i],b[i]=h[i]; //a[i]存放中序里根左边序列 //b[i]存放后序里根左边序列,与a[i]个数相同,不会多的,中序遍历为左根右,后序为左右根 a[i]='\0';//方便strlen b[i]='\0'; i=i+1;//i为下面服务 dg(a,b);//递归 在中序里根左边序列找左子树的根 //此时i=4 for(j=0;i<strlen(h);i++,j++) a[j]=z[i],b[j]=h[i-1]; a[j]='\0'; b[j]='\0'; dg(a,b);//递归 在中序里根右边序列找右子树的根 } int main() { char h[9],z[9]; scanf("%s",z); scanf("%s",h); dg(z,h); return 0; }
举例
DBACEGF
中序z=ABCDEFG
后序h=ACBFGED
打印D-----在中序里找到D,a=ABC,b=ACB
递归-----打印B-----在中序里找到B,a=A,b=A
这里i=2
递归-----符合边界条件直接打印A---返回
在a=ABC,b=ACB里
接下来 a[0]=z[2]=C,即a=C
b[0]=h[1]=C,即b=C
递归----打印C
i=4,接下来a[0]=z[4]=E……a[6]=z[6]=G,即a=EFG
b[0]=h[3]=F……b[6]=h[5]=E,即b=FGE
递归-----打印E----在中序里找到E,a=空,b=空---返回
在a=EFG
b=FGE里
这里i=1
接下来a[0]=z[1]=F a[2]=z[2]=G,即a=FG
b[0]=h[0]=F b[2]=h[1]=G,即b=FG
递归2-----打印G------符合边界条件打印F
相关文章推荐
- 【备战蓝桥杯】【递归】【C语言】【ALGO-11算法训练 瓷砖铺放】
- 【备战蓝桥杯】【递归】【C语言】【ALGO-95算法训练 2的次幂表示】
- 蓝桥杯 ALGO-20 算法训练 求先序排列 Java版
- 蓝桥杯 ALGO-150 算法训练 6-1 递归求二项式系数值
- 蓝桥杯 ALGO-151 算法训练 6-2递归求二进制表示位数
- 蓝桥杯 ALGO-150 算法训练 6-1 递归求二项式系数值 java版
- 蓝桥杯 ALGO-150 算法训练 6-1 递归求二项式系数值
- 蓝桥杯 ALGO-11算法训练 瓷砖铺放(递归/动态规划)
- 蓝桥杯ALGO-125算法训练 王、后传说(回溯、递归)
- 备战蓝桥杯——算法经典趣题(渔夫捕鱼)递归,递推,循坏算法
- 蓝桥杯 - 算法训练 - 铁轨 栈 C语言实现
- 蓝桥杯ALGO-104——算法训练 阿尔法乘积
- 算法训练_求先序排列 【使用递归】
- 蓝桥杯 ALGO-53 算法训练 最小乘积(基本型)
- 蓝桥杯 ALGO-111 算法训练 明明的随机数
- ALGO-1 蓝桥杯算法训练第一题 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。
- 蓝桥杯--算法训练之ALGO-1 区间k大数查询
- 蓝桥杯--算法训练之ALGO-81 动态数组使用
- 蓝桥杯--算法训练之ALGO-79 删除数组零元素
- 蓝桥杯 ALGO-34算法训练 纪念品分组(贪心算法+排序)