题意:

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

思路:

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

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

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

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. 【详细】Python基础(一)

    @ 目录 前言 1. Python环境的搭建 1.1 python解释器的安装 1.2 pycharm的安装 2. Python基础语法 2.1 基本语法 2.2 数据类型 2.3 标识符与关键字 2 ...

  2. Go语言从入门到放弃(四)

    前言 有段时间没摸Go语言了,最近B站的Go语言泄露挺火的. 还差的很远呐 学无止境 本章主要介绍一些零碎的小知识点 变更记录 # 19.4.30  起笔 # 19.4.30  增加代码打包步骤 正文 ...

  3. 深入汇编指令理解Java关键字volatile

    volatile是什么 volatile关键字是Java提供的一种轻量级同步机制.它能够保证可见性和有序性,但是不能保证原子性 可见性 对于volatile的可见性,先看看这段代码的执行 flag默认 ...

  4. 【Oracle】下载11.2.0.4的地址

    https://updates.oracle.com/download/13390677.html 这个地址就是下载Oracle 11.2.0.4版本的地址,需要有metalink账号才可以下载

  5. File Inclusion - Pikachu

    概述: 文件包含,是一个功能.在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件. 比如 在PHP中,提供了: include(),inclu ...

  6. AVA编程中button按钮,actionlistener和mouseClicked区别

    在java的编程中,对于按钮button 有两个事件: 1.actionPerformed 2.mouseClicked 区别: actionPerformed:一般事件,仅侦听鼠标左键的单击事件,右 ...

  7. FI_F4_ZTERM付款条件代码

    这个函数可以弹出一个选择帮助,返回一个付款条件代码 CALL FUNCTION 'FI_F4_ZTERM' EXPORTING I_KOART = 'K' " K为供应商,D为客户 * I_ ...

  8. Spring Aop中四个重要概念,切点,切面,连接点,通知

    1. 通知: 就是我们编写的希望Aop时执行的那个方法.我们通过Aop希望我们编写的方法在目标方法执行前执行,或者执行后执行.2. 切点:切点就是我们配置的满足我们条件的目标方法.比如我们规定:名字前 ...

  9. 《Go 语言并发之道》读后感 - 第四章

    <Go 语言并发之道>读后感-第四章 约束 约束可以减轻开发者的认知负担以便写出有更小临界区的并发代码.确保某一信息再并发过程中仅能被其中之一的进程进行访问.程序中通常存在两种可能的约束: ...

  10. IP2188中文资料书

    IP2188 是一款集成 12 种.用于 USB 输出端口的快充协议 IC,支持 USB 端口充电协议.支持 11种快充协议,包括 USB TypeC PD2.0/PD3.0/PPS DFP,HVDC ...