zoukankan      html  css  js  c++  java
  • 遍历问题 codevs

    1029

    遍历问题

    1029 遍历问题

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 钻石 Diamond
    题目描述 Description

        我们都很熟悉二叉树的前序、中序、后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历。然而给定一棵二叉树的前序和后序,你却不能确定其中序遍历序列,考虑如下图中的几棵二叉树:

        所有这些二叉树都有着相同的前序遍历和后序遍历,但中序遍历却不相同。

    输入描述 Input Description

        输入文件共2行,第一行表示该树的前序遍历结果,第二行表示该树的后序遍历结果。输入的字符集合为{a-z},长度不超过26。

    输出描述 Output Description

        输出文件只包含一个不超过长整型的整数,表示可能的中序遍历序列的总数。

    样例输入 Sample Input

    abc

    cba

    样例输出 Sample Output

    4

    思路

    只有一个儿子 的节点 才会在知道 前序后序 的情况下有不同的中序遍历,所以将题目转化成找 只有一个儿子的节点个数。

    可以很容易的找出这类节点在前序后序中出现的规律。(前序中出现AB,后序中出现BA,则这个节点只有一个儿子)

    每个这类节点有两种中序遍历(及儿子在左,儿子在右)根据乘法原理中序遍历数为 2^节点个数 种

    代码

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    char qian[30];
    char hou[30];
    int ans=0;
    int main()
    {
        scanf("%s%s",qian,hou);
        for(int i=0;i<=strlen(qian)-1;i++)
            for(int j=1;j<=strlen(hou)-1;j++)
                if(qian[i]==hou[j]&&qian[i+1]==hou[j-1])
                    ans++;
        printf("%d",1<<ans);
    }

    2010

    求后序遍历

    2010 求后序遍历

     

     时间限制: 1 s
     空间限制: 64000 KB
     题目等级 : 白银 Silver
     
     
     
    题目描述 Description

    输入一棵二叉树的先序和中序遍历序列,输出其后序遍历序列。

    输入描述 Input Description

    共两行,第一行一个字符串,表示树的先序遍历,第二行一个字符串,表示树的中序遍历。

    输出描述 Output Description

    仅一行,表示树的后序遍历序列。

    样例输入 Sample Input

    abdehicfg

    dbheiafcg

    样例输出 Sample Output

    dhiebfgca

    数据范围及提示 Data Size & Hint

    输入长度不大于255。

    代码

    #include<iostream>
    using namespace std;
    int len;
    string s1,s2;
    void dfs(int s,int l,int r)
    {
        if(l==r)return;
        int pos=l;
        for(int i=l;i<=r;i++)if(s1[s]==s2[i]){pos=i;break;}
        dfs(s+1,l,pos);
        dfs(s+pos-l+1,pos+1,r);
        cout<<s1[s];
    }
    int main()
    {
        cin>>s1>>s2;
        len=s1.length();
        dfs(0,0,len);
    }

    3143

    二叉树的序遍历

    3143 二叉树的序遍历

     

     时间限制: 1 s
     空间限制: 32000 KB
     题目等级 : 白银 Silver
     
     
    题目描述 Description

    求一棵二叉树的前序遍历,中序遍历和后序遍历

    输入描述 Input Description

    第一行一个整数n,表示这棵树的节点个数。

    接下来n行每行2个整数L和R。第i行的两个整数Li和Ri代表编号为i的节点的左儿子编号和右儿子编号。

    输出描述 Output Description

    输出一共三行,分别为前序遍历,中序遍历和后序遍历。编号之间用空格隔开。

    样例输入 Sample Input

    5

    2 3

    4 5

    0 0

    0 0

    0 0

    样例输出 Sample Output

    1 2 4 5 3

    4 2 5 1 3

    4 5 2 3 1

    数据范围及提示 Data Size & Hint

    n <= 16

    代码

    #include<iostream>
    using namespace std;
    int n;
    struct node{
        int l,r;
    }tree[20];
    void dfs(int v)
    {
        cout<<v<<' ';
        if(tree[v].l!=0)dfs(tree[v].l);
        if(tree[v].r!=0)dfs(tree[v].r);
    }
    void afs(int v)
    {
        if(tree[v].l!=0)afs(tree[v].l);
        cout<<v<<' ';
        if(tree[v].r!=0)afs(tree[v].r);
    }
    void cfs(int v)
    {
        if(tree[v].l!=0)cfs(tree[v].l);
        if(tree[v].r!=0)cfs(tree[v].r);
        cout<<v<<' ';
    }
    int main()
    {
        cin>>n;
        int x,y;
        for(int i=1;i<=n;i++)
        {
            cin>>x>>y;
            tree[i].l=x;
            tree[i].r=y;
        }
        dfs(1);cout<<endl;
        afs(1);cout<<endl;
        cfs(1);
    }
  • 相关阅读:
    Markdown语法入门
    Android开发——绘图基础
    数据结构(java版)学习笔记(三)——线性表之单链表
    数据结构(java版)学习笔记(二)——线性表之顺序表
    数据结构(java版)学习笔记(一)——线性表
    优化电脑方法收集(一)——加内存系统没变化?改几项注册表再感受下
    数据结构(java版)学习笔记(序章)
    基础:从概念理解Lucene的Index(索引)文档模型
    lucene之排序、设置权重、优化、分布式搜索(转)
    Lucene提供的条件判断查询
  • 原文地址:https://www.cnblogs.com/thmyl/p/6159962.html
Copyright © 2011-2022 走看看