PAT1020 (已知中序,后序遍历转前序遍历)
已知后序与中序输出前序(先序):
后序:3, 4, 2, 6, 5, 1(左右根)
中序:3, 2, 4, 1, 6, 5(左根右)
已知一棵二叉树,输出前,中,后时我们采用递归的方式。同样也应该利用递归的思想:
对于后序来说,最后一个节点肯定为根。在中序中可以找到左子树的个数,那么就可以在后序中找到左子树的根;同理也可以找到右子树。
void pre(int root, int start, int end) {
if(start > end) return ;
int i = start;
while(i < end && in[i] != post[root]) i++;
printf("%d ", post[root]);
pre(root - - end + i, start, i - );
pre(root - , i + , end);
}
如果想要按照层次输出数,那么我们可以增加一个index变量,来存储结点。根节点为0,左子树为index*2+1, 右子树为index*2+2,那么我们按顺序输出不是-1的节点即可
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
vector<int>lever(,-),post,in;
int n;
void pre(int root,int start,int end,int index)
{
if(start>end)
return;
int i=start;
while(i<end&&in[i]!=post[root])
i++;
lever[index]=post[root];
pre(root-end+i-,start,i-,index*+);
pre(root-,i+,end,index*+);
}
int main()
{
scanf("%d",&n);
post.resize(n+);
in.resize(n+);
for(int i=;i<=n;i++)
scanf("%d",&post[i]);
for(int i=;i<+n;i++)
scanf("%d",&in[i]);
pre(n,,n,);
int cnt=;
for(int i=;i<lever.size();i++)
{
if(lever[i]!=-)
{
cnt++;
if(cnt==n)
{
printf("%d\n",lever[i]);
break;
}
else
printf("%d ",lever[i]);
}
}
}
PAT1020 (已知中序,后序遍历转前序遍历)的更多相关文章
- 已知树的前序、中序,求后序的java实现&已知树的后序、中序,求前序的java实现
public class Order { int findPosInInOrder(String str,String in,int position){ char c = str.charAt(po ...
- 已知树的前序、中序,求后序的c++实现&已知树的后序、中序,求前序的c++实现
#include"iostream" using namespace std; int pre[30]; int in[30]; int post[30]; int indexOf ...
- TZOJ 3209 后序遍历(已知中序前序求后序)
描述 在数据结构中,遍历是二叉树最重要的操作之一.所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问. 这里给出三种遍历算法. 1.中序遍历的递归算法定义: ...
- SDUT 1489 求二叉树的先序遍历 (中序后序还原二叉树)
求二叉树的先序遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 已知一 ...
- PAT Advanced 1127 ZigZagging on a Tree (30) [中序后序建树,层序遍历]
题目 Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree c ...
- 算法进阶面试题03——构造数组的MaxTree、最大子矩阵的大小、2017京东环形烽火台问题、介绍Morris遍历并实现前序/中序/后序
接着第二课的内容和带点第三课的内容. (回顾)准备一个栈,从大到小排列,具体参考上一课.... 构造数组的MaxTree [题目] 定义二叉树如下: public class Node{ public ...
- 二叉树 遍历 先序 中序 后序 深度 广度 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- c++中二叉树的先序中序后序遍历
c++中二叉树的先(前)序.中序.后序遍历 讲解版 首先先看一个遍历的定义(源自度娘): 所谓遍历(Traversal),是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问.访问结点所做的 ...
- 【数据结构】二叉树的遍历(前、中、后序及层次遍历)及leetcode107题python实现
文章目录 二叉树及遍历 二叉树概念 二叉树的遍历及python实现 二叉树的遍历 python实现 leetcode107题python实现 题目描述 python实现 二叉树及遍历 二叉树概念 二叉 ...
随机推荐
- PHP + Apache 在 Linux(centos7)系统下的环境搭建,基于 yum
(本文采用的是 Centos7 的操作系统,简单起见,以下全部采用 yum 安装,有这么好用的东西为什么要自己去一个一个编译呢) 1, 安装 Apache => yum -y install ...
- ajax二次封装之异步加载
ajax二次封装之异步加载 ajax异步加载会导致在数据未加载回来就读取数据,然后出现数据为空的报错.在ajax封装时,将ajax直接改为同步,虽然可以解决报错,但是会导致页面渲染被阻塞,接口反应时间 ...
- leetcode140
class Solution(object): def wordBreak(self, s, wordDict): """ :type s: str :type word ...
- linux 实用指令
通过init 来制定/切换不同的运行指令 查看linux 系统下,电脑的运行级别 vim /etc/inittab 如何找回丢失的root密码? 进入到单用户模式,然后修改root密码 进入到单用户 ...
- How to make MySQL handle UTF-8 properly
To make this 'permanent', in my.cnf: [client] default-character-set=utf8 [mysqld] character-set-serv ...
- DMA/Zero copy
DMA: 直接内存访问,是一种不经过CPU而直接从内存存取数据的数据交换模式.在DMA模式下,CPU只须向DMA控制器下达指令,让DMA控制器来处理数据的传送,数据传送完毕再把信息反馈给CPU,这样就 ...
- MemSQL 架构初探(转)
MemSQL 自称是最快的内存数据库.目前已发布了2.5版本. MemSQL 具有以下特点 1 高效的并行,尤其是分布式的MemSQL. 2 高效的并发,采用lock-free的内存数据结构skip ...
- c++复习:C++输入和输出流
C++输入和输出流 1.I/O流的概念和流类库的结构 程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件. C++输入输出包含以下三个方面的内容: 对系统指定的标准 ...
- byte类型的127+1=-128?
public class Test2 { public void add(Byte b) { b = b++; } public void test() { Byte a = 127; Byte ...
- mysql分库分区分表
分表: 分表分为水平分表和垂直分表. 水平分表原理: 分表策略通常是用户ID取模,如果不是整数,可以首先将其进行hash获取到整. 水平分表遇到的问题: 1. 跨表直接连接查询无法进行 2. 我们需要 ...