order

Description

给出一棵二叉树的中序遍历和每个节点的父节点,求这棵二叉树的先序和后 序遍历。

Input

输入第一行为一个正整数 n 表示二叉树的节点数目, 节点编号从 1 到 n,其中 1 为根节点。
第 2 行有 n 个数字, 第 i 个数字表示 i 的父亲节点。( 1 的父亲节点为 0, 表示无)
第 3 行为中序遍历。
30%的数据: n<=20;
60%的数据: n<=1000;
100%的数据: n<=10000;

Output

输出 2 行, 第一行为先序遍历,第二行为后序遍历。

Sample Input

100 7 2 2 9 1 8 1 6 89 5 6 1 10 8 7 3 2 4

Sample Output

1 6 9 5 8 10 7 2 3 45 9 6 10 3 4 2 7 8 1

思路

存下每个节点的左右儿子,然后根据中序遍历判断谁是左儿子,谁是右儿子,建完树,跑一下先序遍历和后序遍历

 
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 10005;
int lson[maxn],rson[maxn],pos[maxn];
bool first = true;  

void PreOrder(int x)
{
    if (x != 1) printf(" ");
    printf("%d",x);
    if (lson[x])    PreOrder(lson[x]);
    if (rson[x])    PreOrder(rson[x]);
}  

void PostOrder(int x)
{
    if (lson[x])    PostOrder(lson[x]);
    if (rson[x])    PostOrder(rson[x]);
    first?printf("%d",x):printf(" %d",x);
    first = false;
}  

int main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    int N,i,tmp;
    memset(lson,0,sizeof(lson));
    memset(rson,0,sizeof(rson));
    memset(pos,0,sizeof(pos));
    scanf("%d",&N);
    for (i = 1;i <= N;i++)
    {
        scanf("%d",&tmp);
        if (tmp == 0)   continue;
        if (!lson[tmp]) lson[tmp] = i;
        else    rson[tmp] = i;
    }
    for (i = 1;i <= N;i++)
    {
        scanf("%d",&tmp);
        pos[tmp] = i;
    }
    for (i = 1;i <= N;i++)
    {
        if (lson[i] && rson[i])
        {
            if (pos[rson[i]] < pos[lson[i]])
            {
                swap(rson[i],lson[i]);
            }
        }
        else if (!lson[i] && rson[i])
        {
            if (pos[rson[i]] < pos[i])
            {
                lson[i] = rson[i];
                rson[i] = 0;
            }
        }
        else if (lson[i] && !rson[i])
        {
            if (pos[lson[i]] > pos[i])
            {
                rson[i] = lson[i];
                lson[i] = 0;
            }
        }
    }
    PreOrder(1);printf("\n");
    PostOrder(1);printf("\n");
    return 0;
}

  

数据结构作业——order(二叉树遍历)的更多相关文章

  1. javascript数据结构与算法--二叉树遍历(后序)

    javascript数据结构与算法--二叉树遍历(后序) 后序遍历先访问叶子节点,从左子树到右子树,再到根节点. /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * * * */ ...

  2. javascript数据结构与算法--二叉树遍历(先序)

    javascript数据结构与算法--二叉树遍历(先序) 先序遍历先访问根节点, 然后以同样方式访问左子树和右子树 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...

  3. javascript数据结构与算法--二叉树遍历(中序)

    javascript数据结构与算法--二叉树遍历(中序) 中序遍历按照节点上的键值,以升序访问BST上的所有节点 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...

  4. 二叉树遍历,递归,栈,Morris

    一篇质量非常高的关于二叉树遍历的帖子,转帖自http://noalgo.info/832.html 二叉树遍历(递归.非递归.Morris遍历) 2015年01月06日 |  分类:数据结构 |  标 ...

  5. SDUT 3344 数据结构实验之二叉树五:层序遍历

    数据结构实验之二叉树五:层序遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知一个按 ...

  6. java数据结构之二叉树遍历的非递归实现

    算法概述递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍历算法.非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似.对 ...

  7. SDUT OJ 数据结构实验之二叉树五:层序遍历

    数据结构实验之二叉树五:层序遍历 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descri ...

  8. SDUT OJ 数据结构实验之二叉树二:遍历二叉树

    数据结构实验之二叉树二:遍历二叉树 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descr ...

  9. SDUT 3341 数据结构实验之二叉树二:遍历二叉树

    数据结构实验之二叉树二:遍历二叉树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知二叉 ...

随机推荐

  1. java并发:线程同步机制之ThreadLocal

    1.简述ThreadLocal ThreadLocal实例通常作为静态的私有的(private static)字段出现在一个类中,这个类用来关联一个线程.ThreadLocal是一个线程级别的局部变量 ...

  2. 【python游戏编程之旅】第七篇---pygame中的冲突检测技术

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 上一个博客我们一起学习了pygame中的Sprite模块和如何加载动画:http://www.cnblogs ...

  3. 替罪羊树模板(BZOJ1056/1862)

    #include<cstdio> #include<cstring> #include<cmath> #include<iostream> #defin ...

  4. [转]mysql免安装版配置

    现在mysql有一个installer,相当于安装包管理器.包含mysql的各个组件,比如workbench,各个语言的connector.十分方便,不用就可惜了.实在没有必要下载zip版,自己配置. ...

  5. 【jQuery】Jquery.cookie()

    注意:如果不设置path,默认为当前路径,新建cookie $.cookie('name', 'value'); 新建带限制时间cookie $.cookie('name', 'value', { e ...

  6. 关于出现 org.apache.commons.lang.exception.NestableRuntimeException的解决方法

    最近做服务端和客户端之间的访问,出现了 org.apache.commons.lang.exception.NestableRuntimeException等状况.实在令人头大,翻到了一个很好的帖子说 ...

  7. SharedPreferences

    除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它是Android数据持久化方法中最简单的一种. 其本质是基于XML文件存储key-value键值对数据,通常用 ...

  8. Android Studio 优秀插件汇总

    第一部分 插件的介绍 Google 在2013年5月的I/O开发者大会推出了基于IntelliJ IDEA java ide上的Android Studio.AndroidStudio是一个功能齐全的 ...

  9. #查看Linux的版本信息

    查看Ubuntu的版本信息 cat /etc/issue lsb_release -a 查看Centos的版本信息 cat /etc/centos-release rpm -q centos-rele ...

  10. Ubuntu里的若干问题解决方案

    1. Ubuntu里出现两个屏幕,并且其中一个是“未知显示器”,无法去除时,可以尝试使用该命令:sudo apt-get install bumblebee-nvidia 2.虚拟机上Ubuntu开机 ...