码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-01-21 23:11:32      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:space   先序   树遍历   span   mamicode   class   front   bre   二叉树   

技术图片

 

 若直接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)

标签:space   先序   树遍历   span   mamicode   class   front   bre   二叉树   

原文地址:https://www.cnblogs.com/JasonPeng1/p/12227156.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!