您的位置:首页 > 编程语言 > C语言/C++

【备战蓝桥杯】【递归】【C语言】【ALGO-20算法训练 求先序排列】

2018-03-12 00:29 597 查看
ALGO-20算法训练 求先序排列  时间限制:1.0s   内存限制:256.0MB关键字:递归问题描述  给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。输入格式  两行,每行一个字符串,分别表示中序和后序排列输出格式  一个字符串,表示所求先序排列样例输入BADC
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: