GPLT L2-006 树的遍历(二叉树)
题意:
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
思路:
后序遍历序列 = 左子树遍历序列 + 右子树遍历序列 + 根节点。
中序遍历序列 = 左子树遍历序列 + 根节点 + 右子树遍历序列。
找到根节点,再利用根节点计算新的后、中遍历序列端点。
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 树的遍历(二叉树)的更多相关文章
- PTA L2-006 树的遍历-二叉树的后序遍历+中序遍历,输出层序遍历 团体程序设计天梯赛-练习集
L2-006 树的遍历(25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤),是二叉树中结点的 ...
- GPTL—练习集—006树的遍历
#include<bits/stdc++.h> using namespace std; typedef int daTp;//datatype typedef struct BTNode ...
- L2-006 树的遍历 (25 分) (根据后序遍历与中序遍历建二叉树)
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805069361299456 L2-006 树的遍历 (25 分 ...
- javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题
赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支 ...
- PTA 7-10 树的遍历(二叉树基础、层序遍历、STL初体验之queue)
7-10 树的遍历(25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数 ...
- 团体程序设计天梯赛 L2-006. 树的遍历 L2-011. 玩转二叉树
L2-006. 树的遍历 #include <stdio.h> #include <stdlib.h> #include <string.h> #include & ...
- 天梯 L2 树的遍历(已知后序中序求层序)
树的遍历 (25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数.第二行 ...
- C++树——遍历二叉树
在讲遍历之前,我们要先创建一个树: #include <iostream> using namespace std; typedef struct node; typedef node * ...
- 数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树
一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈 ...
- 【面经】用递归方法对二叉树进行层次遍历 && 二叉树深度
void PrintNodeAtLevel(BiTree T,int level) { // 空树或层级不合理 ) return; == level) { cout << T->da ...
随机推荐
- 求素数个数的优化-LeetCode204
问题 计数质数 统计所有小于非负整数 n 的质数的数量. 示例: 输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 . 第一种解法容易想到但是会 超时 ...
- Python 中的面向接口编程
前言 "面向接口编程"写 Java 的朋友耳朵已经可以听出干茧了吧,当然这个思想在 Java 中非常重要,甚至几乎所有的编程语言都需要,毕竟程序具有良好的扩展性.维护性谁都不能拒绝 ...
- Head First 设计模式 —— 12. 状态 (State) 模式
思考题 public class GumballMachine { final static int SOLD_OUT = 0; final static int NO_QUARTER = 1; fi ...
- mysql中更改字段属性实际上都做了哪些操作
mysql> set profiling=1; Query OK, 0 rows affected (0.00 sec) mysql> alter table test modify n ...
- 【排序基础】1、选择排序法 - Selection Sort
文章目录 选择排序法 - Selection Sort 为什么要学习O(n^2)的排序算法? 选择排序算法思想 操作:选择排序代码实现 选择排序法 - Selection Sort 简单记录-bobo ...
- 创建一个简单MyBatis程序
文章目录 MyBatis基础 MyBatis 简介 创建一个MyBatis程序 1. 创建Java项目 2. 加载MyBatis包 3. 编写POJO类和映射文件 4.创建mybatis-config ...
- 【Oracle】win7安装报错
在WIN7上安装oracle 10g时,提示如下信息: 正在检查操作系统要求... 要求的结果: 5.0,5.1,5.2,6.0 之一 实际结果: 6.1 检查完成.此次检查的总体结果为: 失败 &l ...
- kubernets之持久卷的动态配置
一 介绍持久卷的动态配置原理 前面介绍的pv以及pvc,都需要kubernets集群管理员来支持实际的底层存储,但是kubernets还支持动态配置持久卷来自动化完成这个任务集群管理员可以创建一个持 ...
- maven打包项目
使用maven可以对项目进行很方便的管理,方便体现之一便是项目的打包发布变得方便,本文主要是讲一下maven打包时的一些命令和注意事项(皆是自己从应用中总结的理解,或有不对之处). maven项目打包 ...
- 微信登录4-开发回调URL
一.准备 1.引入pom依赖 在要使用HttpClient的项目中加入依赖 <!--httpclient--> <dependency> <groupId>org. ...