题意:

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

思路:

后序遍历序列 = 左子树遍历序列 + 右子树遍历序列 + 根节点。

中序遍历序列 = 左子树遍历序列 + 根节点 + 右子树遍历序列。

找到根节点,再利用根节点计算新的后、中遍历序列端点。

Tips:

注意建树时传根节点的引用。

#include <bits/stdc++.h>
using namespace std; const int M=35;
int n,a[M],b[M];//a数组储存后序遍历,b数组储存中序遍历 map<int,int> posb;//后序遍历中某点在中序遍历中的位置 struct Bt{//二叉树结点
int v;
Bt *l,*r;
}*root; void build_tree(Bt* & rt,int l1,int r1,int l2,int r2){//l1~r1为该树的后序遍历序列区间,l2~r2为中序遍历序列区间。
if(l1>r1||l2>r2){//若不存在有效遍历
rt=nullptr;
return;
}
rt=new(Bt);
rt->v=a[r1];//后序倒数第一个即为该子树的根节点
int mid=posb[a[r1]];//该端点在中序遍历中的位置
int len=mid-l2;//左子树的长度
build_tree(rt->l,l1,l1+len-1,l2,mid-1);//递归建立左子树
build_tree(rt->r,l1+len,r1-1,mid+1,r2);//递归建立右子树
} void Print_level(Bt* t){
queue<Bt*> q;
cout<<(t->v);
if(t->l!=nullptr) q.push(t->l);
if(t->r!=nullptr) q.push(t->r);
while(!q.empty()){
Bt* t=q.front();
q.pop();
if(t!=nullptr){
cout<<' '<<(t->v);
if(t->l!=nullptr) q.push(t->l);
if(t->r!=nullptr) q.push(t->r);
}
}
} int main(){
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++){
cin>>b[i];
posb[b[i]]=i;
}
build_tree(root,0,n-1,0,n-1);
Print_level(root);
return 0;
}

最初的做法:

#include <bits/stdc++.h>
using namespace std; const int M=35; struct Bt{
int v;
Bt *l,*r;
}; int n,a[M],b[M];//a数组储存后序遍历,b数组储存中序遍历
map<int,int> posa,posb;//某值在后序、中序遍历中的位置 Bt *root; void build_node(Bt* & pre,int last,int l,int r){//last为根节点的位置,l~r为中序遍历的左右端点
pre=new(Bt);
pre->v=a[last]; int mid=posb[a[last]];//查找在中序遍历的位置
int last1=-1,last2=-1;
int l1=l,r1=mid-1;//计算根节点两边区间的端点
int l2=mid+1,r2=r; for(int i=l1;i<=r1;i++)//枚举该子树结点在后序遍历中的位置,最大值即为该子树根节点的位置
last1=max(last1,posa[b[i]]);
for(int i=l2;i<=r2;i++)
last2=max(last2,posa[b[i]]); if(l1<=r1)//如果中序遍历区间有效,继续建立子树结点
build_node(pre->l,last1,l1,r1);
else
pre->l=nullptr;
if(l2<=r2)
build_node(pre->r,last2,l2,r2);
else
pre->r=nullptr;
} void Print_level(Bt* t){
queue<Bt*> q; cout<<(t->v);
if(t->l!=nullptr) q.push(t->l);
if(t->r!=nullptr) q.push(t->r); while(!q.empty()){
Bt* t=q.front();
q.pop(); if(t!=nullptr){
cout<<' '<<(t->v);
if(t->l!=nullptr) q.push(t->l);
if(t->r!=nullptr) q.push(t->r);
}
}
} int main()
{
cin>>n; for(int i=0;i<n;i++){
cin>>a[i];
posa[a[i]]=i;
} for(int i=0;i<n;i++){
cin>>b[i];
posb[b[i]]=i;
} build_node(root,n-1,0,n-1); Print_level(root); return 0;
}

GPLT L2-006 树的遍历(二叉树)的更多相关文章

  1. PTA L2-006 树的遍历-二叉树的后序遍历+中序遍历,输出层序遍历 团体程序设计天梯赛-练习集

    L2-006 树的遍历(25 分)   给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤),是二叉树中结点的 ...

  2. GPTL—练习集—006树的遍历

    #include<bits/stdc++.h> using namespace std; typedef int daTp;//datatype typedef struct BTNode ...

  3. L2-006 树的遍历 (25 分) (根据后序遍历与中序遍历建二叉树)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805069361299456 L2-006 树的遍历 (25 分 ...

  4. javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题

    赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支 ...

  5. PTA 7-10 树的遍历(二叉树基础、层序遍历、STL初体验之queue)

    7-10 树的遍历(25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数 ...

  6. 团体程序设计天梯赛 L2-006. 树的遍历 L2-011. 玩转二叉树

    L2-006. 树的遍历 #include <stdio.h> #include <stdlib.h> #include <string.h> #include & ...

  7. 天梯 L2 树的遍历(已知后序中序求层序)

    树的遍历 (25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数.第二行 ...

  8. C++树——遍历二叉树

    在讲遍历之前,我们要先创建一个树: #include <iostream> using namespace std; typedef struct node; typedef node * ...

  9. 数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树

    一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈 ...

  10. 【面经】用递归方法对二叉树进行层次遍历 && 二叉树深度

    void PrintNodeAtLevel(BiTree T,int level) { // 空树或层级不合理 ) return; == level) { cout << T->da ...

随机推荐

  1. 初识 D3.js :打造专属可视化

    一.前言 随着现在自定义可视化的需求日益增长,Highcharts.echarts等高度封装的可视化框架已经无法满足用户各种强定制性的可视化需求了,这个时候D3的无限定制的能力就脱颖而出. 如果想要通 ...

  2. 坐上JDK8时间SDK的小船,带你遨游UNIX时间戳与时区的小太空~

    原文链接:坐上JDK8时间SDK的小船,带你遨游UNIX时间戳与时区的小太空- 一.背景: 最近有一个关于店铺数据实时分析的需求,需要实时统计店铺当天的数据:例如访客数,浏览量.商品排行榜等.由于店铺 ...

  3. oracle坚决不挂01(表,索引,视图的创建,修改,删除,查询)

    考试快来了,来篇oracle干货,复习一下(挣扎一下) 废话不多说,开始写! 这篇是数据库对象的有关操作的总结! 数据库对象有熟悉的表,视图,索引,序列,同义词等(这个oracle东西真不少,小声bb ...

  4. 【Linux】vim关闭终端的时候,忘记退出vim怎么办

    有些时候经常是关闭终端,但是忘记退出vim编辑的文本,每次登陆的时候会提示这个错误 其实很简单,在该文本的路径下,有一个隐藏文件 叫.xxx.txt.swp文件(xxx就是你退出忘记关闭的文件名). ...

  5. 前端基础功能,原生js实现轮播图实例教程

    轮播图是前端最基本.最常见的功能,不论web端还是移动端,大平台还是小网站,大多在首页都会放一个轮播图效果.本教程讲解怎么实现一个简单的轮播图效果.学习本教程之前,读者需要具备html和css技能,同 ...

  6. CodeMonkey少儿编程第2章 turnTo对象

    目标 了解对象的概念 了解方法与对象的关系 掌握turnTo指令的用法 在开始本章的学习之前,我们先来复习一下上一章的知识点. 在第1章中,我们学会了在这个游戏中最简单的两个指令. step x 其中 ...

  7. 入门OJ:最短路径树入门

    题目描述 n个城市用m条双向公路连接,使得任意两个城市都能直接或间接地连通.其中城市编号为1..n,公路编号为1..m.任意个两个城市间的货物运输会选择最短路径,把这n*(n-1)条最短路径的和记为S ...

  8. Git安装/VScode+Git+Github

    Git安装/VScode+Git+Github 1. 相关简介 git 版本控制工具,支持该工具的网站有Github.BitBucket.Gitorious.国内的OS China仓库.Csdn仓库等 ...

  9. 免费稳定图床最佳实践:PicGo+GitHub+jsDeliver 极简教程

    一.下载 PicGo PicGo 是啥?顾名思义,它是一个快速上传图片并获取 图片 URL 链接的工具. 目前支持七牛.腾讯云.阿里云和 GitHub 等图床.该工具代码已在 GitHub 开源,读者 ...

  10. centos下解压rar文件,Linux解压tar.gz和tar.bz2的命令

    1.下载:根据主机系统下载合适的版本,当前64为centos系统演示下载: wget http://www.rarlab.com/rar/rarlinux-x64-5.3.0.tar.gz 2.解压安 ...