二叉树遍历题解(已知中序,层次遍历,求后序遍历)

来源:互联网 发布:win7桌面显示网络图标 编辑:程序博客网 时间:2024/05/22 16:12

题目:

树和二叉树基本上都有先序、中序、后序、按层遍历等遍历顺序,给定中序和其他一种遍历的序列就可以确定一棵二叉树的结构。

假设一棵二叉树一个结点用一个字符描述,现在给出中序和按层遍历的字符串,求该树的先序遍历字符串。

输入:

输入共两行,每行是由字母组成的字符串(一行的每个字符都是唯一的),分别表示二叉树的中序遍历和按层遍历的序列。

输出:

输出就一行,表示二叉树的先序序列。

样例输入: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);    }


欢迎指点




3 0