2020.11.14天梯赛练习*6

7-9 树的遍历 (25分)
 

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

输入格式:

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

输出格式:

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

输入样例:

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

输出样例:

4 1 6 3 5 7 2

思路:根据后序遍历可知,后序遍历的最后一个结点一定是根结点,再根据中序遍历可知,根结点的左边的数是左子树的,右边数是右子树的;左边的数的最后一个数就是左边的根节点以此类推

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
#define MAXSIZE 31 
struct Tnode{
    int data;
    Tnode *left;
    Tnode *right;
};
Tnode *PutBinTree(int a[],int b[],int k){
  /*b为存放后序遍历的数组,b为存放中序遍历的数组,k代表当前结点的左右子树结点的个数和*/ 
    int i,t;
    if(k==0){
        return NULL;
    }
    Tnode *BT=(Tnode *)malloc(sizeof(Tnode));
    t=a[k-1];   //t取后序的最后一个结点 
    BT->data=t;   //存放根结点
    for(i=0;i<k;i++){
        if(b[i]==t){
            break;
        }
    }
    BT->left= PutBinTree(a, b, i);
    BT->right= PutBinTree(a+i, b+i+1, k-i-1);
    return BT;
}
void putBinTree(Tnode *BT) {
    Tnode *s[MAXSIZE];
    int t=0,k=1;
    s[t]=BT;
    while(t!=k){
        if(!t){
            cout<<s[t]->data; //第一个数字不加空格 
        }else{
           cout<<" "<<s[t]->data; 
        }
        if(s[t]->left) {
            s[k]=s[t]->left;
            k=(k+1)%MAXSIZE;
        }
        if(s[t]->right) {
            s[k]=s[t]->right;
            k=(k+1)%MAXSIZE;
        }
        t=(t+1)%MAXSIZE;
    }
}

int main(){
    int i, n;
    int a[MAXSIZE],b[MAXSIZE];
    cin>>n;
    for(i=0;i<n;i++){
        cin>>a[i];
    }
    for(i=0;i<n;i++){
        cin>>b[i];
    }
    Tnode *BT=PutBinTree(a,b,n);
    putBinTree(BT);
    return 0;
}
View Code

 

 

posted @ 2020-11-22 21:46  Endeavo_r  阅读(110)  评论(0)    收藏  举报