zoukankan      html  css  js  c++  java
  • sicily 1210 二叉树

    Description

    在众多的数据结构中,二叉树是一种特殊而重要的结构,有着广泛的应用。二叉树或者是一个结点,或者有且仅有一个结点为二叉树的根,其余结点被分成两个互不相交的子集,一个作为左子集,另一个作为右子集,每个子集又是一个二叉树。

    遍历一棵二叉树就是按某条搜索路径巡访其中每个结点,使得每个结点均被访问一次,而且仅被访问一次。最常使用的有三种遍历的方式:

    1.前序遍历:若二叉树为空,则空操作;否则先访问根结点,接着前序遍历左子树,最后再前序遍历右子树。

    2.中序遍历:若二叉树为空,则空操作;否则先中序遍历左子树,接着访问根结点,最后再前中遍历右子树。

    3.后序遍历:若二叉树为空,则空操作;否则先后序遍历左子树,接着后序遍历右子树,最后再访问根结点。

    例如图(1)所示的二叉树:

    前序遍历的顺序是ABCD,中序遍历的顺序是CBAD,后序遍历的顺序是CBDA。

    对一棵二叉树,如果给出前序遍历和中许遍历的结点访问顺序,那么后序遍历的顺序是唯一确定的,也很方便地求出来。但如果现在只知道前序遍历和后序遍历的顺序,中序遍历的顺序是不确定的,例如:前序遍历的顺序是ABCD,而后序遍历的顺序是CBDA,那么就有两课二叉树满足这样的顺序(见图(1)和图(2))。

    现在的问题是给定前序遍历和后序遍历的顺序,要求出总共有多少棵不同形态的二叉树满足这样的遍历顺序。

    Input

    整个输入有两行,第一行给出前序遍历的访问顺序,第二行给出后序遍历的访问顺序。 
    二叉树的结点用一个大写字母表示,不会有两个结点标上相同字母。输入数据不包含空格,且保证至少有一棵二叉树符合要求。

    Output

    输出一个整数,为符合要求的不同形态二叉树的数目。 

    Sample Input

    ABCD
    CBDA

    Sample Output

    2

    分析:

    可以这么考虑,当且仅当以节点为根的子树(或原树)子节点只有一个,会产生多种解的情况。那么明显,仅仅根据前序和后序遍历的结果,单个的子节点无法确定左右位置。可以判断有n个这样的节点,那么就可能有2^n种生成树。而这样的节点在本题中的明显特征就是,对应前序遍历路径中的特定节点,它的右面相邻的节点和后序遍历中此节点的左面相邻节点相同。最后注意,利用string的成员函数find()可以节省很多时间。

    ps:本题还有另外的表示方法,即直接比较对应字符,不过这里采用别人的一种解法,更有意思也更能体会二叉树遍历的特点。

    代码:

     1 // Problem#: 1210
     2 // Submission#: 1860874
     3 // The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
     4 // URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
     5 // All Copyright reserved by Informatic Lab of Sun Yat-sen University
     6 #include <iostream>
     7 #include <string>
     8 using namespace std;
     9 
    10 int main(){
    11     string str1,str2;
    12     int re = 1;
    13     cin >> str1 >> str2;
    14     int size = str1.size();
    15     int tmp = size - 1;
    16     for( int i=1 ; i<size ; i++ ){
    17         int j = str2.find(str1[i]);
    18         if( j==tmp-1 ) re *= 2;
    19         tmp = j;
    20     }
    21     cout << re;
    22     return 0;
    23 }
  • 相关阅读:
    php7安装Memcached扩展
    php7安装
    结束进程
    openssl 编译
    boost 编译
    php 与 c++ openssl 加密通信
    iptables 端口转发
    获取进程及父进程的两种方式
    windows 下获取父进程pid
    CentOS 64位系统 yum安装32位软件包的方法
  • 原文地址:https://www.cnblogs.com/ciel/p/2876801.html
Copyright © 2011-2022 走看看