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

题目:

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

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

输入:

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

输出:

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

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

欢迎指点


 

    原文作者:点击重新加载
    原文地址: https://blog.csdn.net/qq_37494296/article/details/54971215
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞