经常有面试题就是知道一棵树的前序遍历和中序遍历让你写出后序遍历,这个慢慢画是能画出来的,但是要很快的弄出来还是要懂原理。

首先说一下三种遍历:所谓的前序后序和中序都是遍历时遍历根节点的顺序。子树的话依照从做左到右的顺序,比如前序就是:中-》左-》右,中序就是:左-》中-》右。

现在前序是: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++树,知道前序和中序求后序遍历的更多相关文章

  1. HDU 1710 二叉树遍历,输入前、中序求后序

    1.HDU  1710  Binary Tree Traversals 2.链接:http://acm.hust.edu.cn/vjudge/problem/33792 3.总结:记录下根结点,再拆分 ...

  2. 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 ...

  3. Tree Recovery(前序中序求后序)

    Tree Recovery Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14640   Accepted: 9091 De ...

  4. python实现根据前序与中序求后序

    我就不板门弄斧了求后序 class Tree(): def __init__(self,x): self.value=x self.left=None self.right=None class So ...

  5. UVa 二叉树重建(先序+中序求后序)

    题意是给出先序和中序,求出后序. 先序遍历先访问根结点,通过根结点可以在中序中把序列分为左子树部分和右子树部分,我建了一个栈,因为后序遍历最后访问根结点,所以把每次访问的根结点放入栈中.因为后序遍历先 ...

  6. 【美国血统 American Heritage 题解】已知前序中序 求后序

    题目: 题目名称:美国血统 American Heritage 题目来源:美国血统 American Heritage ## 题目描述 农夫约翰非常认真地对待他的奶牛们的血统.然而他不是一个真正优秀的 ...

  7. ACM题目————已知前序和中序求后序

    #include <iostream> #include <cstring> #include <cstdio> using namespace std; ], z ...

  8. 二叉排序树的构造 && 二叉树的先序、中序、后序遍历 && 树的括号表示规则

    二叉排序树的中序遍历就是按照关键字的从小到大顺序输出(先序和后序可没有这个顺序) 一.以序列 6 8 5 7 9 3构建二叉排序树: 二叉排序树就是中序遍历之后是有序的: 构造二叉排序树步骤如下: 插 ...

  9. 已知树的前序、中序,求后序的java实现&已知树的后序、中序,求前序的java实现

    public class Order { int findPosInInOrder(String str,String in,int position){ char c = str.charAt(po ...

随机推荐

  1. Kotlin在处理GET和POST请求的数据问题

    1.网络请求获取到的数据流处理 java写法 BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf-8& ...

  2. QMdiArea及QMdiSubWindow实现父子窗口及布局方法

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QMdiArea及QMdiSubWindow实现父子窗口及布局方法     本文地址:http ...

  3. FastReport.Net 无限页高(连续纸小票)

    using System; using System.Collections; using System.Collections.Generic; using System.ComponentMode ...

  4. Robotium之“去哪儿旅行”

    Robotium基于APK自动化测试,只有APK文件,没有源代码. Eclipse 默认的debug keystore可以在Windows->Preferences->Android-&g ...

  5. java 使用volatile实现线程数据的共享

    java 使用volatile实现线程数据的共享 直接上代码看效果: public class VolatileTest extends Thread { private volatile boole ...

  6. HDU4043_FXTZ II

    题目描述的意思就不说了,自己考虑的时候就是在所有的排列中,碰到大于前面最大的出现数字的时候就乘以一个二分之一,然后求和. 打表后就会发现,答案分子为1*3*5*……*(2*n-1):分母为2*4*6* ...

  7. UVA12585_Poker End Games

    题目是这样的,每个人手中有a和b的钱数,c为a和b中间最小的一个. 每个回合,两个人胜利的概率都是0.5,胜利者从失败者手中获得c的钱数. 如果有一个人手中没钱的话,那么他就failer,游戏结束. ...

  8. Redis windows环境安装 以及 redis整合spring

    Redis对于Linux是官方支持的,安装和使用没有什么好说的,普通使用按照官方指导,5分钟以内就能搞定.详情请参考: http://redis.io/download Redis官方是不支持wind ...

  9. C++解析(10):struct和class的区别

    0.目录 1.默认访问级别 2.默认继承方式 2.1 分别独立继承 2.2 struct继承class 2.3 class继承struct 3.小结 1.默认访问级别 在用struct定义类时,所有成 ...

  10. 解数独(Python)

    0.目录 1.介绍 2.一些通用函数 3.全局变量(宏变量) 4.数独预处理(约束传播) 5.解数独(深度优先搜索+最小代价优先) 6.主函数 7.总代码 1.介绍 数独是一个非常有趣味性的智力游戏, ...