解题思路:递归,通过中序和后序推出先序。
参考代码:
//后序排列最后一个一定是根节点
//从中序排列中找出根,前半段是左子树,后半段右子树
//后序排列中最后一个能找到的子树中有的字母是子树的根(也有可能是整棵树)
#include<stdio.h>
#include<string.h>
char a[100]/*存中序*/, b[100]/*存后序*/;
void tree(int d, int e)//递归
{
int i, f, c, j;
c = 0;//c归零
if (d > e) return;//查找范围为d-e(一颗树),范围中没东西了就结束查找
for (j = strlen(a) - 1; j >= 0; j--)//倒着找,以便找出最后一个
{
for (i = d; i <= e; i++)//遍历整棵树
{
if (a[i] == b[j])//找到了就记录并结束查找
{
c = i;//24~27行c变动的缘由
break;
}
}
if (c)//c有变动,退出循环(没变动说明没找到或者最后才找到)
{
break;
}
}
printf("%c", a[c]);//输出根
tree(d, c - 1);//先对左子树使用函数
tree(c + 1, e);//再对右子树使用函数
}
int main()
{
int i, c;
scanf("%s %s", a, b);
tree(0, strlen(a) - 1);//调用函数
}
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复