c++树,知道前序和中序求后序遍历
经常有面试题就是知道一棵树的前序遍历和中序遍历让你写出后序遍历,这个慢慢画是能画出来的,但是要很快的弄出来还是要懂原理。
首先说一下三种遍历:所谓的前序后序和中序都是遍历时遍历根节点的顺序。子树的话依照从做左到右的顺序,比如前序就是:中-》左-》右,中序就是:左-》中-》右。
现在前序是:ABDGCEFH
中序是:DGBAECHF
想要求后序就要把树重建出来,我们理一下思路。
1.由前序遍历的性质可以知道A必然是树的根节点
2.中序遍历中A之前的就肯定是A的左子树,A后面的就是A的右子树。
好的,我们现在可以把中序分一下,变成:DGB | A | ECHF
同样左子树和右子树在前序上也是连续的,所以我们可以分成 A | BDG | CEFH
你一定已经想到递归了,对,如果只看左子树的话又当成一个新的树,题目变成已知前序为:BDG,中序为:DGB,求原来的树。右子树同理。
上代码,自己瞎写的。。。。多多包涵
#include <iostream>
#include <string> using namespace std;
struct Node
{
char val ;
Node *rc , *lc ;
} ;
Node* rebuild(string pre,string mid)
{
int i , len ;
Node *head = new Node() ;
head->val = pre[] ;
//cout << pre<< " " << mid << endl ;
len = mid.length() ;
for(i=;i<len;i++)
{
if(pre[]==mid[i])
{
if(i!=)
{
head->lc = rebuild(pre.substr(,i),mid.substr(,i));//左子树
}
else{
head->lc = NULL ;
}
if(i!=len-)
{
head->rc = rebuild(pre.substr(i+,len--i),mid.substr(i+,len--i));//右子树
}
else{
head->rc = NULL ;
}
}
}
return head ;
}
void after(Node *head)
{
if(head==NULL)
{
return ;
}
else{
if(head->lc!=NULL)
after(head->lc) ;
if(head->rc!=NULL)
after(head->rc) ;
cout << head->val << endl ;
}
}
int main()
{
string pre , mid ;
Node *head = NULL ;
while(cin>>pre>>mid)
{
Node * head ;
head = rebuild(pre,mid) ;
after(head) ;
}
return ;
}
注意substr这个函数的参数的意思是substr(start,length),递归左子树的时候,左子树子串前序和中序的length等于i,并不是到i那个位置结束。
c++树,知道前序和中序求后序遍历的更多相关文章
- HDU 1710 二叉树遍历,输入前、中序求后序
1.HDU 1710 Binary Tree Traversals 2.链接:http://acm.hust.edu.cn/vjudge/problem/33792 3.总结:记录下根结点,再拆分 ...
- PAT (Advanced Level) 1136~1139:1136模拟 1137模拟 1138 前序中序求后序 1139模拟
1136 A Delayed Palindrome(20 分) 题意:给定字符串A,判断A是否是回文串.若不是,则将A反转得到B,A和B相加得C,若C是回文串,则A被称为a delayed palin ...
- Tree Recovery(前序中序求后序)
Tree Recovery Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14640 Accepted: 9091 De ...
- python实现根据前序与中序求后序
我就不板门弄斧了求后序 class Tree(): def __init__(self,x): self.value=x self.left=None self.right=None class So ...
- UVa 二叉树重建(先序+中序求后序)
题意是给出先序和中序,求出后序. 先序遍历先访问根结点,通过根结点可以在中序中把序列分为左子树部分和右子树部分,我建了一个栈,因为后序遍历最后访问根结点,所以把每次访问的根结点放入栈中.因为后序遍历先 ...
- 【美国血统 American Heritage 题解】已知前序中序 求后序
题目: 题目名称:美国血统 American Heritage 题目来源:美国血统 American Heritage ## 题目描述 农夫约翰非常认真地对待他的奶牛们的血统.然而他不是一个真正优秀的 ...
- ACM题目————已知前序和中序求后序
#include <iostream> #include <cstring> #include <cstdio> using namespace std; ], z ...
- 二叉排序树的构造 && 二叉树的先序、中序、后序遍历 && 树的括号表示规则
二叉排序树的中序遍历就是按照关键字的从小到大顺序输出(先序和后序可没有这个顺序) 一.以序列 6 8 5 7 9 3构建二叉排序树: 二叉排序树就是中序遍历之后是有序的: 构造二叉排序树步骤如下: 插 ...
- 已知树的前序、中序,求后序的java实现&已知树的后序、中序,求前序的java实现
public class Order { int findPosInInOrder(String str,String in,int position){ char c = str.charAt(po ...
随机推荐
- 各种GIT代码托管工具比较
bitbucket免费支持5个开发成员的团队创建无限私有代码托管库. GOES是一个由GO语音编写的自组GIT托管服务. gitorious 是一个基于GIT版本控制系统的WEB项目托管平台,基于RU ...
- 对Excle的行和列进行检查 单元格类型转换代码 ;
对Excle的行和列进行检查 转换代码 : ** * 导入信息 */ @Override public List<Object> add(HttpServletRequest reque ...
- Linux下编译程序时,经常会遇到“undefined reference to XXX” 报错,
Linux下编译程序时,经常会遇到“undefined reference to XXX” 报错, 这里总结一些可能的原因和解决方案,给需要的朋友: 说道undefined reference err ...
- 第194天:js---函数对象详解(arguments、length)
一.函数即对象 function add1(a,b){ return a+b; } //Function对象的实例 -- 高级技巧 --- 写框架必须用的... //前面表示参数,后面表示函数语句 v ...
- 51nod 1674 区间的价值V2(思维+拆位+尺取法)
最近被四区题暴虐... 题意:lyk拥有一个区间. 它规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有数or起来的值的乘积. 例如3个数2,3,6.它们and起来的值为2,or起来的值 ...
- 【bzoj5174】[Jsoi2013]哈利波特与死亡圣器 二分+树形dp
题目描述 给你一棵以1为根的有根树,初始除了1号点为黑色外其余点均为白色.Bob初始在1号点.每次Alice将其中至多k个点染黑,然后Bob移动到任意一个相邻节点,重复这个过程.求最小的k,使得无论B ...
- BZOJ4939 Ynoi2016掉进兔子洞(莫队+bitset)
容易发现要求三个区间各数出现次数的最小值.考虑bitset,不去重离散化后and一发就可以了.于是莫队求出每个区间的bitset.注意空间开不下,做多次即可.输出的东西错了都能调一年服了我了. #in ...
- Exception异常 自定义异常
public class Exception extends Throwable Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件. public ...
- [学习笔记]kruskal重构树 && 并查集重构树
Kruskal 重构树 [您有新的未分配科技点][BZOJ3545&BZOJ3551]克鲁斯卡尔重构树 kruskal是一个性质优秀的算法 加入的边是越来越劣的 科学家们借这个特点尝试搞一点事 ...
- Codeforces 17.E Palisection
E. Palisection time limit per test 2 seconds memory limit per test 128 megabytes input standard inpu ...