【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 ...
随机推荐
- SQL Server - 四种排序, ROW_NUMBER() /RANK() /DENSE_RANK() /ntile() over()
>>>>英文版 (更简洁易懂)<<<< 转载自:https://dzone.com/articles/difference-between-rownum ...
- 华为mate10 UA
Dalvik/2.1.0 (Linux; U; Android 9; ALP-AL00 Build/HUAWEIALP-AL00) "user-agent": "Mozi ...
- tarjan 题目汇总(含解析)
下面容许我偷个懒,洛谷上写过的blog我就不来再抄一遍了 洛谷P3436 [[POI2006]PRO-Professor Szu](别称:作死的老教授) 洛谷P4306 [[JSOI2010]连通数] ...
- 【原创】大叔经验分享(5)oozie提交spark任务如何添加依赖
spark任务添加依赖的方式: 1 如果是local方式运行,可以通过--jars来添加依赖: 2 如果是yarn方式运行,可以通过spark.yarn.jars来添加依赖: 这两种方式在oozie上 ...
- laravel 汇总数据
public function userInfluenceCollect(Request $request) { $types = ['logins', "checkins", & ...
- 百度地图api文档实现任意两点之间的最短路线规划
两个点之间的路线是使用“Marker”点连接起来的,目前还没找到改变点颜色的方法,测试过使用setStyle没有效果. <html><head> <meta http-e ...
- 著名的3像素Bug(div+img,多出几像素)
<div><img src="...."></div> 给img的css设置display: block;/*用来去除div下边莫名多出来的3p ...
- web.xml中Servlet4.0版本的头信息格式
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmln ...
- P4147 玉蟾宫 二维DP 悬线法
题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N*M个格子,每个格子里写着'R'或者'F ...
- DDoS攻击与防御(4)
在发生DDoS攻击的情况下,可以通过一些缓解技术来减少攻击对自身业务和服务的影响,从而在一定程度上保障业务正常运行.缓解DDoS攻击的主要方法是对网络流量先进行稀释再进行清洗. 1.攻击流量的稀释 1 ...