栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

pat甲级1020 Tree traversals (后序+中序 ->层序)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

pat甲级1020 Tree traversals (后序+中序 ->层序)

第一次做不出来,学习了柳神的解法

pre函数的参数 root:根节点在后序中的位置;

start:子树在中序中开始位置序号;end:子树在中序中结束的位置序号

index:从0开始,每个节点的序号 左边是2*index+1,右边是2*index;

层序遍历即可按照index从小到大的顺序输出

#include 
#include "map"
#include "vector"
#include "algorithm"
using namespace std;
vector pos,in;
map m;
void pre(int root,int start,int end,int index){
    if (start>end) return;
    int i = start;
    while (isecond);
    while (++i != m.end()) printf(" %d",i->second);
}

这样结合算法笔记上的代码好像更好理解一些:

[postL,postR]当前二叉树的后序序列区间,[inL,inR]当前二叉树的中序序列区间,index表示当前元素序号
#include 
#include "map"
#include "vector"
#include "algorithm"
using namespace std;
vector pos,in;
map m;
//void pre(int root,int start,int end,int index){
//    if (start>end) return;
//    int i = start;
//    while (i inR) return;
    int i = inL;
    while (i<=inR && in[i]!=pos[postR]) i++;
    m[index] = pos[postR];
    int numleft = i - inL;
    pre(postL,postL+numleft-1,inL,i-1,2*index+1);
    pre(postL+numleft,postR-1,i+1,inR,2*index+2);
}
int main() {
    int mm,temp;
    scanf("%dn",&mm);
    pos.resize(mm);
    in.resize(mm);
    for (int i = 0; i < mm; ++i) {
        scanf("%d",&pos[i]);
    }
    for (int i = 0; i < mm; ++i) {
        scanf("%d",&in[i]);
    }
    pre(0,mm-1,0,mm-1,0);
    auto i = m.begin();
    printf("%d",i->second);
    while (++i != m.end()) printf(" %d",i->second);
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/767145.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号