zoukankan      html  css  js  c++  java
  • 二叉树遍历 ——已知后序,中序求层序 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; 
    } 
  • 相关阅读:
    SecureCRT 迁移到新环境,配置导出
    Git 常用操作
    Java 性能分析工具 Asyncprofiler
    冒号语法
    后台乱码转中文
    js讲解视频
    下载指定版本的loader.调整文件夹结构
    react大型数据渲染列表
    git拉取报错
    记录一个排序表格的插件
  • 原文地址:https://www.cnblogs.com/JasonPeng1/p/12227156.html
Copyright © 2011-2022 走看看