根据 中序遍历 和 后序遍历构造树(Presentation)(C++)
好不容易又到周五了,周末终于可以休息休息了。写这一篇随笔只是心血来潮,下午问了一位朋友PAT考的如何,顺便看一下他考的试题,里面有最后一道题,是关于给出中序遍历和后序遍历然后求一个层次遍历。等等,我找一下链接出来......
1127. ZigZagging on a Tree (30):https://www.patest.cn/contests/pat-a-practise/1127
突然想起以前学数据结构的时候如果给出一个中序遍历和一个后序遍历然后让你画出树的结构或求出先序遍历之类的题目,如果用笔来画,三下五除二能够一下子就画出来,但关于用语言编写出来却从来没有想过,真是惭愧,所以这篇随笔的内容思维可能比较简单低阶,请大家包涵。
所以想试一下能不能写一写,加之最近在补习一些算法和数据结构之类的题目,可以作为一个练手的题目。想不到要动手之前理清一下构造的过程,最后却有些明朗的感觉,这也是我想写下这篇随笔的原因,虽然简单,但很有意义。好,说了这么多废话...下面开始:
对于一棵树的中序遍历,根节点肯定处于遍历结果的中间(假设这棵树有左子树),后序遍历的时候根节点肯定是最后一个遍历的元素。所以可以轻易得到根在中序遍历中的位置,根据中序遍历的性质,以根为中点往后遍历到的元素就是这棵树的右子树元素,往前遍历到的就是这棵树的左子树元素。而后续遍历也是把这棵树的左子树全部遍历完整之后再来遍历右子树,因此在后续遍历中,左子树和右子树的元素也是有明显的界限。而对于根节点的左节点和右节点也是同样的道理。举个例子

所以我们从最初的遍历顺序开始,找出后续遍历的最后一个元素在中序遍历中的位置,然后以这个位置为重点,往右的遍历元素为A,往左的遍历元素为B,根据A和B的长度可以确定在后续遍历中的遍历元素边界,对A和B进行上一步的操作,直到所有元素遍历完成。代码:
Node *getRoot(int* inorder,int* postorder,int ix,int iy,int px,int py){
Node *node = new Node(postorder[py]);
int p = findElem(inorder,postorder[py],ix,iy);
if(- != p){
int lix,liy,lpx,lpy,rix,riy,rpx,rpy;
if(p == iy)node->right = NULL;
else{
rix = p+;
riy= iy;
rpy = py-;
rpx = rpy - (riy-rix);
node->right = getRoot(inorder,postorder,rix,riy,rpx,rpy);
}
if(p == ix) node->left = NULL;
else{
lix = ix;
liy = p -;
lpx = px;
lpy = px + (liy-lix);
node->left = getRoot(inorder,postorder,lix,liy,lpx,lpy);
}
return node;
}else
return NULL;
}
void MidTraverse(Node *root){
if(NULL != root){
cout<<root->val<<" ";
MidTraverse(root->left);
MidTraverse(root->right);
}
}
int main(){
int count;
cin>>count;
int *inorder = new int[count];
int *postorder = new int[count];
for(int i =;i<;i++){
for(int j=;j<count;j++){
int in;
cin>>in;
if(==i) inorder[j] = in;
else postorder[j] = in;
}
}
Node *root = getRoot(inorder,postorder,,count-,,count-);
if(NULL !=root)
MidTraverse(root);
}
节点定义为:
typedef struct _Node{
int val;
struct _Node *left,*right;
_Node(int _val):val(_val),left(NULL),right(NULL){}
}Node;
运行代码,最后结果在意料之内:

深圳的工作压力强行把市民的生活节奏拉的飞快,上了一周的班心绪有些烦躁,下班出了公司的门却意外地迎来了树叶和泥土的味道,是一场雨清澈了整片空气。
根据 中序遍历 和 后序遍历构造树(Presentation)(C++)的更多相关文章
- lintcode: 中序遍历和后序遍历树构造二叉树
题目 中序遍历和后序遍历树构造二叉树 根据中序遍历和后序遍历树构造二叉树 样例 给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2] 返回如下的树: 2 / \ 1 3 注意 你可 ...
- java编写二叉树以及前序遍历、中序遍历和后序遍历 .
/** * 实现二叉树的创建.前序遍历.中序遍历和后序遍历 **/ package DataStructure; /** * Copyright 2014 by Ruiqin Sun * All ri ...
- python数据结构之树和二叉树(先序遍历、中序遍历和后序遍历)
python数据结构之树和二叉树(先序遍历.中序遍历和后序遍历) 树 树是\(n\)(\(n\ge 0\))个结点的有限集.在任意一棵非空树中,有且只有一个根结点. 二叉树是有限个元素的集合,该集合或 ...
- TZOJ 3209 后序遍历(已知中序前序求后序)
描述 在数据结构中,遍历是二叉树最重要的操作之一.所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问. 这里给出三种遍历算法. 1.中序遍历的递归算法定义: ...
- LintCode2016年8月8日算法比赛----中序遍历和后序遍历构造二叉树
中序遍历和后序遍历构造二叉树 题目描述 根据中序遍历和后序遍历构造二叉树 注意事项 你可以假设树中不存在相同数值的节点 样例 给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2] 返回如下 ...
- 数据结构实习 - problem K 用前序中序建立二叉树并以层序遍历和后序遍历输出
用前序中序建立二叉树并以层序遍历和后序遍历输出 writer:pprp 实现过程主要是通过递归,进行分解得到结果 代码如下: #include <iostream> #include &l ...
- LintCode-72.中序遍历和后序遍历树构造二叉树
中序遍历和后序遍历树构造二叉树 根据中序遍历和后序遍历树构造二叉树 注意事项 你可以假设树中不存在相同数值的节点 样例 给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2] 返回如下的树: ...
- 小小c#算法题 - 11 - 二叉树的构造及先序遍历、中序遍历、后序遍历
在上一篇文章 小小c#算法题 - 10 - 求树的深度中,用到了树的数据结构,树型结构是一类重要的非线性数据结构,树是以分支关系定义的层次结构,是n(n>=0)个结点的有限集.但在那篇文章中,只 ...
- 数据结构学习-BST二叉查找树 : 插入、删除、中序遍历、前序遍历、后序遍历、广度遍历、绘图
二叉查找树(Binary Search Tree) 是一种树形的存储数据的结构 如图所示,它具有的特点是: 1.具有一个根节点 2.每个节点可能有0.1.2个分支 3.对于某个节点,他的左分支小于自身 ...
随机推荐
- 【原】Java学习笔记030 - 异常
package cn.temptation; public class Sample01 { public static void main(String[] args) { /* * 异常:Java ...
- 当发现你的OpenStack虚拟机网络有问题,不妨先试一下这16个步骤
1. Security Group全部打开,这是最基本的,但是很多人容易忘记 其实遇到过无数这种场景了,Debug了半天网络问题,各种手段都用上了,最后发现安全组竟然没有打开. 2. 通过界面查看虚拟 ...
- ajax 上传文件
最近做公司官网,需要用到上传文件功能,由于是用JQ写的,用到了input标签 的type=file 属性,然后利用表单提交方式上传,代码如下: $('#upload_video').change(fu ...
- HTTP请求过程-域名解析和TCP三次握手建立链接
我们在浏览器输入http://www.baidu.com想要进入百度首页,但是这是个域名,没法准确定位到服务器的位置,所以需要通过域名解析,把域名解析成对应的ip地址,然后通过ip地址查找目的主机.整 ...
- MySQL单表百万数据记录分页性能优化,转载
背景: 自己的一个网站,由于单表的数据记录高达了一百万条,造成数据访问很慢,Google分析的后台经常报告超时,尤其是页码大的页面更是慢的不行. 测试环境: 先让我们熟悉下基本的sql语句,来查看下我 ...
- js,获取和设置cookie、 localStorage
cookie 跟域名有关系的浏览器缓存 获取cookie document.cookie; 获取到的如果是多条cookie信息,是以分号和一个空格("; ")隔开:a=1; b=2 ...
- 简单总结下 cookie、session
Cookies: 定义:cookie 中文意思是"小甜饼",但是,在互联网中它跟食品没有半毛钱关系,它主要是由web服务器应用程序创建,在客户端计算机中保存,问题来了, ...
- assert断言检测
assert 是宏,非函数,包含在assert.h 头文件中. 如果其后面括号里的值为假,则程序终止运行,并提示出错.这个 宏只在 Debug 版本上起作用,而在 Release 版本被编译器完全优化 ...
- hadoop-eclipse-plugin-2.x.x 插件编译
在网上找的hadoop for eclipse 插件都不能用,决定自己去编译一个.Hadoop 提供了一个 Eclipse 插件以方便用户在 Eclipse 集成开发环境中使用 Hadoop,如管理 ...
- vmware虚拟机各个版本的安装破解(附安装包和注册机)
VMware 是平时我们常用的虚拟机软件,特别是我们平时想试试其他的系统,比如说linux系统的时候但是又不想安装双系统,那么这个时候我们就可以试试这款虚拟软 件,如果你的电脑配置(主要是内存)够好的 ...