首先。先序遍历是先访问根节点。然后左节点 然后右节点。从根节点开始 直到它的子节点没有左节点才开始回溯访问上一个节点的右节点。同理。中序遍历 先访问左节点 然后是父节点 然后是右节点。从根节点开始 直到它的孩子节点没有左节点 才开始回溯访问该节点 然后是它的父节点 然后是它的兄弟右节点。也就是说 每次访问一个节点时 它的左节点已经被访问过了。访问过之后 就要访问它的 右节点。(有点醉T_T.......)后续遍历。从根节点开始 直到叶子节点。先访问左节点 然后是右节点。然后回溯访问父节点。注意回溯到总的根节点时不能直接访问 还要像左子树一样遍历到叶子节点访问完左右节点时才能访问该节点。也就是说。每次访问一个节点 都要确定它的左右节点都已经被访问完。。。。。。。赤果果的深搜啊。。。。。。。。

额....这个题是给你先序和中序求后序。也可以根据后序和中序写出前序。但是不可能根据前序和后序求中序...(然而我并不懂为什么.........)

明白了这些....这就是dfs了...注意好好理解前序确定父节点的信息....中序确定左右子树的元素....于是唯一确定了后序数列....附代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<stack>
using namespace std;

int pre[1010], in[1010];
stack<int>aft;  //存放父节点。即后续遍历数列。

void build(int l1, int r1, int l2, int r2)  // l1,r1表示前序遍历数组的开始和结尾。 l2和r2表示中序遍历数组的开始和结尾。
{
     int i;
     aft.push(pre[l1]); // 父节点入栈
     for (i=l2; i<=r2; ++i)
     {
         if (pre[l1] == in[i])
            break;  //找到父节点在中序遍历数组里的位置。
     }
     int j = l1+(i-l2+1); //找到右子树的父节点在先序数组里的位置。即左子树和右子树在先序遍历的分界点
     if (j<=r1 && i+1<=r2)  // 该节点在中序遍历数组里右边还有数即存在右子树,且右子树父节点在先序范围里
     {
         build(j, r1, i+1, r2); // 求解右子树.因为要求的是后续遍历数列而且存储在栈中。所以每次先找右子树。再找左子树。
     }
     if (l1+1<=j-1 && l2<=i-1)
     {
         build(l1+1, j-1, l2, i-1);  // 求解左子树。
     }
}

int main()
{
    int n;
    while (cin >> n)
    {
        for (int i=0; i<n; ++i)
        {
            cin >> pre[i];
        }
        for (int i=0; i<n; ++i)
        {
            cin >> in[i];
        }
        build(0, n-1, 0, n-1);
        bool flag = true;
        while(!aft.empty())
        {
            if (flag)
            {
                cout << aft.top();
                flag = false;
            }
            else
            {
               cout << ' ' << aft.top();
            }
            aft.pop();
        }
        cout << endl;
    }
    return 0;
}

HDU 1710 二叉树遍历的更多相关文章

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

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

  2. hdu 1710 二叉树的遍历

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1710 大意:给出一个二叉树的前序和中序,求其后序遍历 ps:1.在写链表时,需要写明typedef str ...

  3. HDU 1710 二叉树三种遍历

    Binary Tree Traversals Problem Description A binary tree is a finite set of vertices that is either ...

  4. HDU 1710 二叉树的遍历 Binary Tree Traversals

    Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  5. hdu1710(Binary Tree Traversals)(二叉树遍历)

    Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  6. HDU 1710 Binary Tree Traversals(二叉树)

    题目地址:HDU 1710 已知二叉树先序和中序求后序. #include <stdio.h> #include <string.h> int a[1001], cnt; ty ...

  7. hdu 4605 线段树与二叉树遍历

    思路: 首先将所有的查询有一个vector保存起来.我们从1号点开始dfs这颗二叉树,用线段树记录到当前节点时,走左节点的有多少比要查询该节点的X值小的,有多少大的, 同样要记录走右节点的有多少比X小 ...

  8. C++ 二叉树遍历实现

    原文:http://blog.csdn.net/nuaazdh/article/details/7032226 //二叉树遍历 //作者:nuaazdh //时间:2011年12月1日 #includ ...

  9. python实现二叉树遍历算法

    说起二叉树的遍历,大学里讲的是递归算法,大多数人首先想到也是递归算法.但作为一个有理想有追求的程序员.也应该学学非递归算法实现二叉树遍历.二叉树的非递归算法需要用到辅助栈,算法着实巧妙,令人脑洞大开. ...

随机推荐

  1. Java中的三大框架分别有什么用

    一.Spring Spring是一个解决了许多在J2EE开发中常见的问题的强大框架. Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯.Spring的架构基础是 ...

  2. TCP 的连接建立:采用三报文握手

  3. git如何列出分支之间的差异commit

    答:使用git log master..diff_master 这样就可以列出在diff_master分支中包含的commit而在master分支中不包含的commit

  4. hdu4528 小明系列故事——捉迷藏(记录状态的BFS)题解

    思路: 一道BFS题,和以前的BFS有点不同,这里的vis数组需要记录每次走时的状态,所以开了3维,只对该状态下的vis修改. 注意坑点:S的位置是可以走的 代码: #include<queue ...

  5. The equation (扩展欧几里得)题解

    There is an equation ax + by + c = 0. Given a,b,c,x1,x2,y1,y2 you must determine, how many integer r ...

  6. Spring Security配置

    更加优雅地配置Spring Securiy(使用Java配置和注解):https://www.cnblogs.com/xxzhuang/p/5960001.html 采用注解方式实现security: ...

  7. Android程序示例

    目录 Android代码示例 OptionsMenu ImageButton CheckBox & RadioButton Context Menu快捷菜单 Key Event ListVie ...

  8. Parallel.For with await and wait()

    static void Parallel2() { ParallelLoopResult result = Parallel.For(, , i => { Log($"S:{i} &q ...

  9. MongoDB(课时19 数据删除)

    3.4.4 删除数据 在MongoDB里面删除数据使用“remove()”.但是这个函数有两个可选项: 删除条件:满足条件的数据被删除. 只删除一个数据:设置为true或者是1表示只删除一个. 范例: ...

  10. [ios]ios读写文件本地数据

    参考:http://blog.csdn.net/tianyitianyi1/article/details/7713103 ios - Write写入方式:永久保存在磁盘中.具体方法为:第一步:获得文 ...