zoukankan      html  css  js  c++  java
  • PAT甲题题解-1127. ZigZagging on a Tree (30)-中序、后序建树

    根据中序遍历和前序遍历确定一棵二叉树,然后按“层次遍历”序列输出。
    输出规则:除根节点外,接下来每层的节点输出顺序是:先从左到右,再从右到左,交替输出

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <string.h>
    #include <string>
    #include <map>
    #define LEFT 0
    #define RIGHT 1
    using namespace std;
    const int maxn=35;
    int inorder[maxn];
    int postorder[maxn];
    int level[maxn][maxn]; //每层的节点id
    int levelcnt[maxn]; //每层的节点个数
    int maxlayer=0;
    int cnt=0; //节点id
    struct Node{
        int left=-1,right=-1;
        int val;
    }node[maxn];
    
    //根据中序遍历和后序遍历建立树
    void build(int inL,int inR,int postL,int postR,int fa,int LorR){
        if(inL>inR)
            return;
        int val=postorder[postR];
        int idx;
        //在中序遍历中找出父亲节点的索引,其左边是左子树,右边是右子树
        for(int i=inL;i<=inR;i++){
            if(inorder[i]==val){
                idx=i;
                break;
            }
        }
        int lnum=idx-inL;
        cnt++;
        node[cnt].val=val;
        if(LorR==LEFT)
            node[fa].left=cnt;
        else if(LorR==RIGHT)
            node[fa].right=cnt;
        int tmp=cnt;
        build(inL,idx-1,postL,postL+lnum-1,tmp,LEFT);
        build(idx+1,inR,postL+lnum,postR-1,tmp,RIGHT);
    }
    void dfs(int root,int layer){
        if(root==-1)
            return;
        maxlayer=max(layer,maxlayer);
        level[layer][levelcnt[layer]]=root;
        levelcnt[layer]++;
        dfs(node[root].left,layer+1);
        dfs(node[root].right,layer+1);
    }
    int main()
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>inorder[i];
        for(int i=1;i<=n;i++)
            cin>>postorder[i];
        build(1,n,1,n,-1,-1);
        dfs(1,1);
        bool flag=true;
        printf("%d",node[1].val);
        for(int i=2;i<=maxlayer;i++){
            if(flag){
                for(int j=0;j<levelcnt[i];j++)
                    printf(" %d",node[level[i][j]].val);
            }
            else{
                for(int j=levelcnt[i]-1;j>=0;j--)
                    printf(" %d",node[level[i][j]].val);
            }
            flag=!flag;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    MySQL中TIMESTAMP和DATETIME区别
    图片标签的alt与title区别
    DEDE自带的采集功能,标题太短的解决方法
    Modernizr——为HTML5和CSS3而生!
    InnoDB,MyISAM,Memory区别
    Innodb,MyIsam,聚集索引和非聚集索引
    聚集索引与非聚集索引的总结
    程序kill -9与kill -15的区别,以及回调函数的作用
    linux 信号 SIGINT SIGTERM SIGKILL区别
    oracle mysql sqlserver 查看当前所有数据库及数据库基本操作命令
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/6506517.html
Copyright © 2011-2022 走看看