题目:
树和二叉树基本上都有先序、中序、后序、按层遍历等遍历顺序,给定中序和其他一种遍历的序列就可以确定一棵二叉树的结构。
假设一棵二叉树一个结点用一个字符描述,现在给出中序和按层遍历的字符串,求该树的先序遍历字符串。
输入:
输入共两行,每行是由字母组成的字符串(一行的每个字符都是唯一的),分别表示二叉树的中序遍历和按层遍历的序列。
输出:
输出就一行,表示二叉树的先序序列。
样例输入:DBEAC
ABCDE
样例输出:ABDEC
题解:
本题不需要建树。
做题前先弄明白中序遍历和层次遍历的特点;
首先中序遍历的根结点左侧为左子树,右侧为右子树,而先序遍历优先输出根结点,再遍历左子树,最后遍历右子树,因此,不难想到,先在中序遍历中找到根结点,再先后递归左右子树;
然后,我们单开一个数组从1到结尾给层次遍历的结果做标记,方便在递归中找到根结点(即使递归到了子树也可行)。见代码:
#include<stdio.h>
#include<string.h>
int len,mark[102]; //用来给中序遍历做标记
char s1[102],s2[102]; //储存遍历
void tree(int l,int r){ //递归函数
if(l>r)return; //返回条件,不能等于
int i,j,min=0x7fffff/*int范围的最大值*/,root;
for(i=l;i<=r;i++){
if(mark[s1[i]]<min){
min=mark[s1[i]];root=i; //在中序遍历中找到层次遍历里的最靠前的结点(即先序遍历中要求优先输出的根结点
}
}
printf("%c",s1[root]); //输出根结点
tree(l,root-1); //先遍历左子树
tree(root+1,r); //再遍历右子树,顺序不能调换
}
int main(){
scanf("%s%s",s1+1,s2+1);
len=strlen(s2+1);
int i;
for(i=1;i<=len;i++)
mark[s2[i]]=i; //做标记,虽然s2[i]为字符,但视为ASCII码值,越靠前标记值越小
tree(1,len);
}
欢迎指点