二叉树遍历 ——已知后序,中序求层序 A1020.(25)

Posted jasonpeng1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树遍历 ——已知后序,中序求层序 A1020.(25)相关的知识,希望对你有一定的参考价值。

技术图片

 

 若直接DFS递归求解,会栈溢出

#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn=50;
struct node{
    int data;
    node* lchild;
    node* rchild;
};
int pre[maxn],in[maxn],post[maxn];//先序,中序,后序
int n; //结点个数
//当前二叉树的后续序列区间为[postL,postR],中序序列区间为[inL,inR]
//create函数返回构建出的二叉树的根节点地址
node* create(int postL,int postR,int inL,int inR){
    if(postL>postR){
        return NULL;//后序序列长度小于等于0时,直接返回 
    }
    node* root=new node;//新建一个新的结点,用来存放当前二叉树的根节点
    root->data=post[postR];
    int k;
    for(k=inL;k<=inR;k++){
        if(in[k]==post[postR]){//在中序遍历中找到等于根节点指向的data 
            break;
        }
    }
    int numLeft=k-inL;//左子树的节点个数
    //返回左子树的根节点地址,赋值给root的左指针
    root->lchild=create(postL,postL+numLeft-1,inL,k-1);
    //返回右子树的根节点地址,赋值给root的右指针
    root->rchild=create(postL+numLeft,postR-1,k+1,inR);
    return root;//返回根节点地址      
} 
int num=0; //已输出的结点个数
void BFS(node* root){
    queue<node*> q; //注意队列里是存地址
    q.push(root);//将根节点地址入队
    while(!q.empty()){
        node* now=q.front();//取出队首元素
        q.pop();
        printf("%d",now->data);//访问队首元素的data
        num++;
        if(num<n) printf(" ");
        if(now->lchild!=NULL) q.push(now->lchild);//左子树非空
        if(now->rchild!=NULL) q.push(now->rchild);//右子树非空 
    } 
}
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&post[i]);
    }
    for(int i=0;i<n;i++){
        scanf("%d",&in[i]);
    }
    node* root=create(0,n-1,0,n-1);//建树
    BFS(root);//层序遍历 
    return 0; 
} 

以上是关于二叉树遍历 ——已知后序,中序求层序 A1020.(25)的主要内容,如果未能解决你的问题,请参考以下文章

PAT A1020——已知后序中序遍历求层序遍历

PAT A1020 Tree Traversals [二叉树遍历]

已知先序中序求后序的算法:

二叉树面试题:前中序求后序中后序求前序

二叉树--已知先序中序求后序--已知中序后序求先序(基本按照网上某大神思路搬过来的)

数据结构——已知先序中序求后序,已知中序后序求先序