首先。先序遍历是先访问根节点。然后左节点 然后右节点。从根节点开始 直到它的子节点没有左节点才开始回溯访问上一个节点的右节点。同理。中序遍历 先访问左节点 然后是父节点 然后是右节点。从根节点开始 直到它的孩子节点没有左节点 才开始回溯访问该节点 然后是它的父节点 然后是它的兄弟右节点。也就是说 每次访问一个节点时 它的左节点已经被访问过了。访问过之后 就要访问它的 右节点。(有点醉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. 解决Vue循环中子组件不实时更新的问题

    问题描述 使用Element-UI中的table组件时会遇到一个常见的问题.当在el-table中调用子组件的时候会出现数据更新后,子组件没有重新渲染的问题. eg:资源列表中的健康度组件. 代码如下 ...

  2. Python3基础 if嵌套示例

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  3. HDU 4638Group (莫队)

    Group Problem Description There are n men ,every man has an ID(1..n).their ID is unique. Whose ID is ...

  4. Linq in GroupBy GroupJoin

    还是上一份的代码例子: public class Person { public int ID { get; set; } public string Name { get; set; } publi ...

  5. java中年月日的加减法,年月的加减法使用

    本文为博主原创,未经允许不得转载: java计算两个年月日之间相差的天数: public static int daysBetween(String smdate,String bdate) thro ...

  6. 解决 mininet gave up after 3 retries 问题

    解决 mininet gave up after 3 retries 问题 在通过mn启动mininet的时候遇到了如下问题: *** Creating network *** Adding cont ...

  7. Ubuntu 14.04 下 安装Protocol Buffers

    参考: Protocol Buffers - Google's data interchange format Ubuntu 14.04 下 安装Protocol Buffers 环境 Ubuntu ...

  8. python 递增递减数列

    def is_arithmetic(l): delta = l[] - l[] ): ] - l[index] == delta): return False return True print(is ...

  9. shell逻辑运算符

    逻辑运算符 以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20: 运算符 说明 举例 && 逻辑的 AND [[ $a -lt 100 && ...

  10. Socket入门之前的知识点

    Socket难点 数据粘包 心跳维持 数据丢包 性能问题 7层网络模型-OSI 基础层:物理层(Physical).数据链路层(Datalink).网络层(Network) 传输层(Transport ...