【C++】根据二叉树的前序遍历和中序遍历重建二叉树并输出后续遍历
/*
现在有一个问题,已知二叉树的前序遍历和中序遍历:
PreOrder:GDAFEMHZ
InOrder:ADEFGHMZ
我们如何还原这颗二叉树,并求出他的后序遍历 我们基于一个事实:中序遍历一定是 { 左子树中的节点集合 },root,{ 右子树中的节点集合 },前序遍历的作用就是找到每颗子树的root位置。 算法1
输入:前序遍历,中序遍历
1、寻找树的root,前序遍历的第一节点G就是root。
2、观察前序遍历GDAFEMHZ,知道了G是root,剩下的节点必然在root的左或右子树中的节点。
3、观察中序遍历ADEFGHMZ。其中root节点G左侧的ADEF必然是root的左子树中的节点,G右侧的HMZ必然是root的右子树中的节点,root不在中序遍历的末尾或开始就说明根节点的两颗子树都不为空。
4、观察左子树ADEF,按照前序遍历的顺序来排序为DAFE,因此左子树的根节点为D,并且A是左子树的左子树中的节点,EF是左子树的右子树中的节点。
5、同样的道理,观察右子树节点HMZ,前序为MHZ,因此右子树的根节点为M,左子节点H,右子节点Z。 观察发现,上面的过程是递归的。先找到当前树的根节点,然后划分为左子树,右子树,然后进入左子树重复上面的过程,然后进入右子树重复上面的过程。最后就可以还原一棵树了: PreOrder:GDAFEMHZ
InOrder:ADEFGHMZ
从而得到PostOrder:
AEFDHZMG
*/ #include<iostream>
#include<cstring>
using namespace std;
const int M=;
char pr[M];
char in[M]; struct node
{
char data;
node *l;
node *r;
};
/*
void build(node * & t,int prl,int prr,int inl,int inr)
{
char m=pr[prl];
//printf("%c\n",m);
if(prl>prr||inl>inr)
{
t=NULL;
return ;
}
int i1=0;// -> middle num in the pr
int i2=0;// -> middle num in the in
while(in[i2]!=m)
i2++;
i1=i2;
t=new node();
t->data=m; if(prl==prr||inl==inr)
{
t->l=NULL;
t->r=NULL;
return ;
}
else
{
build(t->l,prl+1,i1,inl,i2-1);//go build left part
build(t->r,i1+1,prr,i2+1,inr);//go build right part
}
}
*/
void create(node * &t, int preL, int preR, int inL,int inR) {
if ( preL > preR )
{
t=NULL;
return ;
}
t = new node();
t->data = pr[preL];
int index;
for ( index = inL; index <= inR; index++ ) {
if ( in[index] == pr[preL] )break;
}
int numLeft = index - inL;
create(t->l, preL+, preL+numLeft, inL, index-);
create(t->r, preL+numLeft+, preR, index+, inR);
} void post_display(const node *t)
{
if(t==NULL)
return ;
post_display(t->l);
post_display(t->r);
printf("%c ",t->data);
} int main()
{ memset(pr,'\0',sizeof(pr));
memset(in,'\0',sizeof(in)); while(cin>>pr&&cin>>in)
{
node *tree=NULL;
if(strlen(pr)==strlen(in))
{
create(tree,,strlen(pr)-,,strlen(pr)-);
cout<<"build tree ok"<<endl;
}
//cout<<tree<<endl<<tree->l<<endl<<tree->r<<endl;
post_display(tree);
cout<<endl;
memset(pr,'\0',sizeof(pr));
memset(in,'\0',sizeof(in));
} return ;
} /*
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 35;
char in[maxn];
char pre[maxn];
struct node {
char data;
node *lchild;
node *rchild;
}; node *Create(int preL, int preR, int inL,int inR) {
if ( preL > preR ) return NULL;
node *root = new node();
root->data = pre[preL];
int index;
for ( index = inL; index <= inR; index++ ) {
if ( in[index] == pre[preL] )break;
}
int numLeft = index - inL;
root->lchild = Create(preL+1, preL+numLeft, inL, index-1);
root->rchild = Create(preL+numLeft+1, preR, index+1, inR);
return root;
} void PostOrderTraversal(node *root) {
if ( root != NULL ) {
PostOrderTraversal(root->lchild);
PostOrderTraversal(root->rchild);
cout << root->data << " ";
}
}
int main() {
int n;
cin >> n; for ( int i = 0; i < n; i++ )
cin >> pre[i];
for ( int i = 0; i < n; i++ )
cin >> in[i];
node *root=NULL;
root = Create(0,n-1,0,n-1); PostOrderTraversal(root); return 0;
}
*/

tz@HZAU
2019/3/16
【C++】根据二叉树的前序遍历和中序遍历重建二叉树并输出后续遍历的更多相关文章
- 数据结构实习 problem L 由二叉树的中序层序重建二叉树
由二叉树的中序层序重建二叉树 writer:pprp 用层序中序来重建二叉树 代码点这里 其实本质上与前序中序建立二叉树没有什么太大区别 大概思路: 递归解法,对当前层进行处理,通过层序遍历可以得到当 ...
- lintcode :前序遍历和中序遍历树构造二叉树
解题 前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: 2 / \ 1 3 注意 你可以假设树中不存 ...
- java编写二叉树以及前序遍历、中序遍历和后序遍历 .
/** * 实现二叉树的创建.前序遍历.中序遍历和后序遍历 **/ package DataStructure; /** * Copyright 2014 by Ruiqin Sun * All ri ...
- LintCode-73.前序遍历和中序遍历树构造二叉树
前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 注意事项 你可以假设树中不存在相同数值的节点 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: ...
- 剑指offer面试题:输入某二叉树的前序遍历和中序遍历,输出后序遍历
二叉树的先序,中序,后序如何遍历,不在此多说了.直接看题目描述吧(题目摘自九度oj剑指offer面试题6): 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结 ...
- 027依据前序遍历和中序遍历,重建二叉树(keep it up)
剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1385 题目描写叙述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.如果输入的前序遍历和中 ...
- 【算法编程 C++ Python】根据前序遍历、中序遍历重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- 剑指offer--(根据前序遍历和中序遍历)重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- [leetcode/lintcode 题解] 前序遍历和中序遍历树构造二叉树
[题目描述] 根据前序遍历和中序遍历树构造二叉树. 在线评测地址: https://www.jiuzhang.com/solution/construct-binary-tree-from-preor ...
随机推荐
- Pytorch里的CrossEntropyLoss详解
在使用Pytorch时经常碰见这些函数cross_entropy,CrossEntropyLoss, log_softmax, softmax.看得我头大,所以整理本文以备日后查阅. 首先要知道上面提 ...
- Arduino语言介绍
Arduino语言介绍 Arduino语言是建立在C/C++基础上的,其基础是C语言,Arduino语言只不过把AVR单片机(微控制器)相关的一些参数设置都函数化,不用我们去了解他的底层,让不了解AV ...
- 「luogu3313」[SDOI2014] 旅行
题目大意 :有 n 个城市连成一棵树, 每个城市有两个关键字, 一个是该城市的宗教, 另一个是城市的评级;旅行者要在城市间旅行, 他只会在和自己宗教相同的城市留宿;维护四个树上操作 { 1. “CC ...
- Fork别人的代码 原作者更新后如何同步
给主题的fork加一个remote 给 fork 配置一个 remote 使用 git remote -v 查看远程状态 ➜ next git:(master) git remote -v origi ...
- 在visual studio 2013中编译Lua5.3.1
注:以下是基于 别人的教程或笔记来操作并按照自己的操作记录的纯文字版编译和hello lua过程. 原图文版链接: 原文链接 1.创建空的解决方案: 文件->新建->项目->其他项目 ...
- 【easy】263. Ugly Number 判断丑数
class Solution { public: bool isUgly(int num) { ) return false; ) return true; && num % == ) ...
- C++实验一
2-28 #include <iostream> using namespace std; int main() {char x; cout<<"Menu: A(dd ...
- SQLAlchemy 使用(一)创建单一model
前言 最近项目等待前端接接口,比较空闲.就想学习一些新东西.学啥呢?考虑到ORM的易用性,还是学习一下ORM.那么与Flask搭配的ORM有 flask-sqlalchemy 但是该组件专为Flask ...
- linux关于软件安装的博文
https://www.cnblogs.com/kundeg/archive/2018/03/06/7247934.html https://www.cnblogs.com/qiaozhoulin/p ...
- Spring Boot mybatis HashMap +layui 通用分页
背景: mybatis 常用数据查询的方法都是先建实体类,再建Mapper,最后写Service,如果只是单纯的去查询数据显示,这样操作太麻烦.本文就以mybatis +layui创建通用分页类,简化 ...