L2-006 树的遍历 (后序中序求层序)
题目:
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2
思路:
前序:根左右
后序:左右根
中序:左根右
依然是区间递归:由后序遍历的规则可知,一个树的遍历的最后一位就是该树的根结点,所以我们只需在中序遍历中找到该根结点即可在中序遍历中分出左右子树,然后左右子树再分别进行递归。如果题目要求的是先序遍历的话只需每层遍历输出根节点即可,但是题目要求输出层序遍历。我们可以建立一个数组level,初值全部设为-1,表示没有结点,将每一层的根节点存入数组的相应位置,然后按顺序输出非-1的元素就能得到层序遍历。
题目中的二叉树不一定是完全二叉树,比如样例中的二叉树如下图中黑色实线。代码中左子树在数组level中存储根节点的位置是index*2+1,右子树是index*2+2,index其实是这两个子树对应的上一层的的根节点。下图红字代表这些结点(没有结点就是-1)在level中存放的位置。比如题目中这个树在level中应该是这样存储的:4 1 6 -1 3 5 7 -1 -1 2 -1 -1 -1 -1……,level这个数组可以理解为代表完全二叉树,相当于要把存在的结点往上面填。
思路来自:https://blog.csdn.net/liuchuo/article/details/52136236

上代码:
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
vector<int> post(),in(),level(,-);
//后序中的最后一个结点是根结点root,在中序中从start到end移动i找到这个根结点的位置,i以左是左子树,以右是右子树
void pre(int start,int end,int root,int index)//index是根节点在数组level中存放的位置
{
if(start>end) return ;//当一个结点就是一个树时,start==end;将这个最底层的叶子结点存入level后就应该结束递归了。
int i=start;
while(i<end&&in[i]!=post[root]) i++;
level[index]=post[root];
pre(start,i-,root-(end-i)-,index*+);
pre(i+,end,root-,index*+);
} int main()
{
int n;
cin>>n;
for(int i=;i<n;i++)
{
cin>>post[i];
}
for(int i=;i<n;i++)
{
cin>>in[i];
}
pre(,n-,n-,);
int cnt=;
for(int i=;i<;i++)
{
if(level[i]!=-&&cnt<n-)
{
cout<<level[i]<<" ";
cnt++;
}else if(level[i]!=-){
cout<<level[i];
break;
}
}
return ;
}
L2-006 树的遍历 (后序中序求层序)的更多相关文章
- PAT Advanced 1138 Postorder Traversal (25) [树的遍历,前序中序转后序]
题目 Suppose that all the keys in a binary tree are distinct positive integers. Given the preorder and ...
- c++树,知道前序和中序求后序遍历
经常有面试题就是知道一棵树的前序遍历和中序遍历让你写出后序遍历,这个慢慢画是能画出来的,但是要很快的弄出来还是要懂原理. 首先说一下三种遍历:所谓的前序后序和中序都是遍历时遍历根节点的顺序.子树的话依 ...
- c++中二叉树的先序中序后序遍历
c++中二叉树的先(前)序.中序.后序遍历 讲解版 首先先看一个遍历的定义(源自度娘): 所谓遍历(Traversal),是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问.访问结点所做的 ...
- PAT Advanced 1020 Tree Traversals (25) [⼆叉树的遍历,后序中序转层序]
题目 Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder an ...
- 已知前序(后序)遍历序列和中序遍历序列构建二叉树(Leetcode相关题目)
1.文字描述: 已知一颗二叉树的前序(后序)遍历序列和中序遍历序列,如何构建这棵二叉树? 以前序为例子: 前序遍历序列:ABCDEF 中序遍历序列:CBDAEF 前序遍历先访问根节点,因此前序遍历序列 ...
- 二叉树 遍历 先序 中序 后序 深度 广度 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- PAT A1020——已知后序中序遍历求层序遍历
1020 Tree Traversals Suppose that all the keys in a binary tree are distinct positive integers. Give ...
- PAT甲级|1151 LCA in a Binary Tree 先序中序遍历建树 lca
给定先序中序遍历的序列,可以确定一颗唯一的树 先序遍历第一个遍历到的是根,中序遍历确定左右子树 查结点a和结点b的最近公共祖先,简单lca思路: 1.如果a和b分别在当前根的左右子树,当前的根就是最近 ...
- 48. leetcode 105题 由树的前序序列和中序序列构建树结构
leetcode 105题,由树的前序序列和中序序列构建树结构.详细解答参考<剑指offer>page56. 先序遍历结果的第一个节点为根节点,在中序遍历结果中找到根节点的位置.然后就可以 ...
- 给出 中序&后序 序列 建树;给出 先序&中序 序列 建树
已知 中序&后序 建立二叉树: SDUT 1489 Description 已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历 Input 输入数据有多组,第一行是一个整数t (t& ...
随机推荐
- logback配置文件---logback.xml详解
一.参考文档 1.官方文档 http://logback.qos.ch/documentation.html 2.博客文档 http://www.cnblogs.com/warking/p/57103 ...
- Appium元素定位(uiautomatorviewer)
一.uiautomatorviewer元素定位 1.adroid-sdk的安装目录tools下有1个自带的工具uiautomatorviewer,打开后,如下所示: 点击后,如图所示: 步骤: a.链 ...
- MySQL两个表联合查询并按时间排序
有一张资金记录表,一张金币记录表,想以时间为单位,降序合并排列他们之间的信息,查询SQL如下: select * from (select * from t_money_logs union sele ...
- centos下安装ipython(minglnghang命令行)
下载文件 wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate 执行安装 python get-pip.py 这就安装好了 ...
- 上传通用化 VHD 并使用它在 Azure 中创建新 VM
本主题逐步讲解如何使用 PowerShell 将通用化 VM 的 VHD 上传到 Azure.从该 VHD 创建映像,然后从该映像创建新 VM. 可以上传从本地虚拟化工具或其他云导出的 VHD. 对新 ...
- Sqlserver函数基础使用
函数基本功能: 转换工厂日期,将8点20之前的时间转化为前一天的时间. if exists (select * from sysobjects where xtype='fn' and name='F ...
- 配置Sharepoint之后。外网无法访问的问题
Sharepoint配置完成了,projectserver也已经配置完毕.突然遇到一个情况就是外网访问不了,这可麻烦了,费了半天事访问不了等于0啊.没办法,研究吧.在群里问了大神,终于解决了.现将解决 ...
- Delphi XE7功能之TMultiView
TMultView,做为一个TPanel来显示控件,可通过属性Mode来控制TMultView的显示效果,如下拉或者以抽屉方式.从屏一侧象抽屉一样显示TMultView,但不会转换主屏,也就是说在主窗 ...
- Linux ping命令详解
Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性 基于IMCP协议 常见命令参数 -q 不显示任何传送封包的信息,只显示最后的结果 -n 只输出数值 -R 记录路由过程 ...
- 乘风破浪:LeetCode真题_018_4Sum
乘风破浪:LeetCode真题_018_4Sum 一.前言 前面我们已经练习过了三个数相加的集合运算,现在变成了四个数,其实道理是一样的.三个数的时候可以转成两个数的加法,最后来解决,而四个数的可以转 ...