根据中序和后序求解层序遍历( 正在做pta的勿抄 数据结构老师会查重)

7-4 树的遍历 (25 分)

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

输出样例:

4 1 6 3 5 7 2

#include<stdio.h>
#include<stdlib.h>
#define maxn 101

typedef int TElem;
typedef struct TNode{
    TElem data;
    struct TNode *lchild,*rchild;

}TNode,*BinTree;

BinTree CreateTree(int A[],int B[],int n){
    BinTree BT = (BinTree)malloc(sizeof(struct TNode));
    if(n<=0) return NULL;
    else{
        int temp = A[n-1];
        int i;
        for(i=0;i<n;i++){   //找到中序遍历根节点所在的相应位置
            if(temp== B[i]){
                break;
            }
        }
        BT->data = temp;  //在树中生成相应数据的节点
        //之后先后遍历左右子树即可
        BT->lchild = CreateTree(A,B,i);
        BT->rchild = CreateTree(A+i,B+i+1,n-i-1);
        return BT;
    }
}

//层序遍历
void LevelTraversal(BinTree BT){
    BinTree a[101];  //建立一个存储树节点的数组
    //这个数组作为队列来用
    //将之后初始的根节点存入数组的a[0]
    //之后每一次取出根节点时,将其左右子节点继续存入数组
    //总而言之,用队列的思想即可解决这个问题
    int i=0,j=0;
    a[0] = BT;
    while(BT){
        if(BT->lchild!=NULL){
            a[++i] = BT->lchild;
        }
        if(BT->rchild!=NULL){
            a[++i] = BT->rchild;
        }
        BinTree temp = a[j];
        printf("%d",temp->data);

        if(i==j){
            break;
        }else printf(" ");
        j++;
        BT = a[j];
    }
}


int main(){
    int n;
    scanf("%d",&n);
    int i;
    int A[maxn],B[maxn];
    for(i=0;i<n;i++){
        scanf("%d",&A[i]);
    }
    for(i=0;i<n;i++){
        scanf("%d",&B[i]);
    }

    BinTree BT = CreateTree(A,B,n);
    LevelTraversal(BT);
    return 0;



}

猜你喜欢

转载自blog.csdn.net/weixin_42200027/article/details/83901811