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& ...
随机推荐
- Manachar算法详解
求解最长回文串之Manachar算法 问题类型: 输入一个字符串,求出其中最大的回文子串.子串的含义是:在原串中连续出现的字符串片段. 回文的含义是:正着看和倒着看相同,如abba和yyxyy. 这类 ...
- [算法练习]String to Integer (atoi)
题目说明: Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input ...
- 获取所有后缀DDE打开命令
概述: 由于需要使用DDE方式打开文件,所以把支持DDE方式打开文件的参数都导出来到文件,方便查找. 并且提供运行DDE命令的工具,可以用于测试DDE功能. 1.运行脚步GetDDE.vbs可以获取系 ...
- vue2.0中的计算属性
计算属性是一个很邪门的东西,只要在它的函数里引用了data中的某个属性,当这个属性发生变化的时候,函数仿佛可以嗅探到这个变化,并自动重新执行. 上代码会源源不断的打印出a的值.如果希望b依赖data中 ...
- 毕向东_Java基础视频教程第20天_IO流(5~6)
第20天-05-IO流(文件列表一) static File[] listRoots() List the available filesystem roots. String[] list() Re ...
- Scratch GUI
原文地址:https://github.com/LLK/scratch-gui/wiki/Getting-Started Getting Started Bryce Taylor edited t ...
- 一、Asp.Net Core WebAPI——修改默认监听端口
参考文档 添加host.json文件 { "urls": "https://localhost:44389;http://localhost:44380" } ...
- PHP面试常用算法(推荐)
一.冒泡排序 基本思想: 对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换.这样比较小(大)的数值就将逐渐从后面向前面移动. ...
- Java日期格式化参数对照表
Symbol Meaning Presentation Example G era designator Text AD y year Number 2009 M month in year Text ...
- Debian 9 vsftpd: version 3.0.3 配置
现在网上关于vsftpd的资料不少,但是版本已经比较老,配置起来各种错误,耽误不少时间,现将配置步骤更新如下,配置环境版本:Debian 9 + vsftpd: version 3.0.3 1.apt ...