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 ...
随机推荐
- js 必须为字母或下划线, 一旦创建不能修改
<div class="form-group"> <label class="col-lg-2 control-label" for=&quo ...
- Flutter 基础组件:按钮
前言 Material组件库中提供了多种按钮组件如RaisedButton.FlatButton.OutlineButton等,它们都是直接或间接对RawMaterialButton组件的包装定制,所 ...
- 2.jmeter组件介绍
jmeter默认语言设置: 1.临时设置: 进入options -- Choose Language -- 选择中文简体,设置后语言 切换成中文,重启失效 2.永久设置:进入jmeter目录下的 ...
- 【Oracle】创建用户配额总是不足的解决问题 quota
在oracle中,正常创建的用户是没有配额限制的,也就是默认的是unlimited on tablespace的,但是在有些时候,没有设置相关的配额,用户总是会报错用户配额严重不足,查看表空间,也有很 ...
- leetcode 940. 不同的子序列 II (动态规划 ,字符串, hash,好题)
题目链接 https://leetcode-cn.com/problems/distinct-subsequences-ii/ 题意: 给定一个字符串,判断里面不相同的子串的总个数 思路: 非常巧妙的 ...
- CTFshow萌新赛-千字文
打开靶机 下载完成后,为一张二维码图片 使用StegSolve 解出隐写图像 保存后使用PS或其他工具去除白边 然后使用脚本分割这个图像(25*25) from PIL import Image im ...
- Netty学习:伪共享
目录 Netty中的伪共享 伪共享的原理以及介绍 Netty中的伪共享 先说为什么知道这个概念吧,期初看Netty源码的时候,看到了NioEventLoop的构建,其中有这么一句代码: private ...
- jQuery库 之 jquery slimscroll插件使用
1.引入jQuery插件 <script type="text/javascript" src="jquery.min.js"></scrip ...
- centos7虚拟机开启端口后 外部不能访问的问题
转载 https://blog.csdn.net/u012045045/article/details/104219823 虚拟机新开了5005端口,系统内部是显示开了的(wget 192.168.4 ...
- 获取网页url中的参数
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...