题目描述:

We are all familiar with pre-order, in-order and post-order traversals of binary trees. A common problem in data structure classes is to find the pre-order traversal of a binary tree when given the in-order and post-order traversals. Alternatively, you can find the post-order traversal when given the in-order and pre-order. However, in general you cannot determine the in-order traversal of a tree when given its pre-order and post-order traversals. Consider the four binary trees below:

All of these trees have the same pre-order and post-order
traversals. This phenomenon is not restricted to binary trees, but holds
for general m-ary trees as well.

输入:

Input will consist of multiple problem instances. Each instance will consist of a line of the form
m s1 s2
        indicating that the trees are m-ary trees, s1 is the pre-order
traversal and s2 is the post-order traversal.All traversal strings will
consist of lowercase alphabetic characters. For all input instances, 1
<= m <= 20 and the length of s1 and s2 will be between 1 and 26
inclusive. If the length of s1 is k (which is the same as the length of
s2, of course), the first k letters of the alphabet will be used in the
strings. An input line of 0 will terminate the input.

输出:
        For
each problem instance, you should output one line containing the number
of possible trees which would result in the pre-order and post-order
traversals for the instance. All output values will be within the range
of a 32-bit signed integer. For each problem instance, you are
guaranteed that there is at least one tree with the given pre-order and
post-order traversals.
样例输入:
2 abc cba
2 abc bca
10 abc bca
13 abejkcfghid jkebfghicda
样例输出:
4
1
45
207352860
经典代码:
 
#include <stdio.h>
#include <string.h>
char pre[30], post[30];
int m;
int find(char* p, char x) {
    int i=0;
    while (p[i]!=x) i++;
    return i;
}
typedef long long ll;
ll C(int a, int b) {
    ll u = 1;
    ll d = 1;
    while (b) {
    u *= a--;
    d *= b--;
    }
    return u/d;
}
ll test(char* p, char* q, int n) {
    if (n==0) return 1;
    ll f = 1;
    int c = 0;
    int i;
    while (n) {
    c++;
    i = find(q,*p);
    f *= test(p+1,q,i);
    p += i+1;
    q += i+1;
    n -= i+1;
    }
    return f * C(m,c);
}
int main() {
    while(scanf("%d%s%s",&m,pre,post)==3) {
    printf("%lld\n",test(pre+1,post,strlen(pre)-1));
    }  
    return 0;
}
 
百度文库的解释:http://wenku.baidu.com/link?url=ZddYeW-pYEgst83coqElNsI-aHY_JwyuHwsKBHkrxPNWxYCMCn0ltDqq7K-IGdZkr48WdgG4chrIkS1h5cWUnhzPQbJBL3a4N_OLUffbe4i

考研编程练习----m叉树先序和后序所包含的情况的更多相关文章

  1. 【算法】二叉树、N叉树先序、中序、后序、BFS、DFS遍历的递归和迭代实现记录(Java版)

    本文总结了刷LeetCode过程中,有关树的遍历的相关代码实现,包括了二叉树.N叉树先序.中序.后序.BFS.DFS遍历的递归和迭代实现.这也是解决树的遍历问题的固定套路. 一.二叉树的先序.中序.后 ...

  2. PAT Advanced 1020 Tree Traversals (25) [⼆叉树的遍历,后序中序转层序]

    题目 Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder an ...

  3. [LeetCode] Construct Binary Tree from Inorder and Postorder Traversal 由中序和后序遍历建立二叉树

    Given inorder and postorder traversal of a tree, construct the binary tree. Note: You may assume tha ...

  4. Java实现二叉树的前序、中序、后序遍历(非递归方法)

      在上一篇博客中,实现了Java中二叉树的三种遍历方式的递归实现,接下来,在此实现Java中非递归实现二叉树的前序.中序.后序遍历,在非递归实现中,借助了栈来帮助实现遍历.前序和中序比较类似,也简单 ...

  5. Java实现二叉树的前序、中序、后序、层序遍历(非递归方法)

      在上一篇博客中,实现了Java中二叉树的四种遍历方式的递归实现,接下来,在此实现Java中非递归实现二叉树的前序.中序.后序.层序遍历,在非递归实现中,借助了栈来帮助实现遍历.前序和中序比较类似, ...

  6. LeetCode(106):从中序与后序遍历序列构造二叉树

    Medium! 题目描述: 根据一棵树的中序遍历与后序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 posto ...

  7. 二叉排序树的构造 && 二叉树的先序、中序、后序遍历 && 树的括号表示规则

    二叉排序树的中序遍历就是按照关键字的从小到大顺序输出(先序和后序可没有这个顺序) 一.以序列 6 8 5 7 9 3构建二叉排序树: 二叉排序树就是中序遍历之后是有序的: 构造二叉排序树步骤如下: 插 ...

  8. JAVA下实现二叉树的先序、中序、后序、层序遍历(递归和循环)

    import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.Queue; ...

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

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

  10. 【二叉树遍历模版】前序遍历&&中序遍历&&后序遍历&&层次遍历&&Root->Right->Left遍历

    [二叉树遍历模版]前序遍历     1.递归实现 test.cpp: 12345678910111213141516171819202122232425262728293031323334353637 ...

随机推荐

  1. apache2 重启、停止、优雅重启、优雅停止

    停止或者重新启动Apache有两种发送信号的方法 第一种方法: 直接使用linux的kill命令向运行中的进程发送信号.你也许你会注意到你的系统里运行着很多httpd进程.但你不应该直接对它们中的任何 ...

  2. ZooKeeper学习之路 (六)ZooKeeper API的简单使用(二)级联删除与创建

    编程思维训练 1.级联查看某节点下所有节点及节点值 2.删除一个节点,不管有有没有任何子节点 3.级联创建任意节点 4.清空子节点 ZKTest.java public class ZKTest { ...

  3. HTML5本地存储(Local Storage) 的前世今生

    长久以来本地存储能力一直是桌面应用区别于Web应用的一个主要优势.对于桌面应用(或者原生应用),操作系统一般都提供了一个抽象层用来帮助应用程序保存其本地数据 例如(用户配置信息或者运行时状态等). 常 ...

  4. C#流概述

    C#流概述 .NET Framework使用“流”来支持读取或写入文件.可以将流视为一组连续的一维数据,包含开头和结尾,并且其中的游标指示了流的当前位置. 1.流操作 流中包含的数据可能来自内存.文件 ...

  5. wepy build 错误 [Error] 未发现相关 less 编译器配置,请检查wepy.config.js文件。

    [Error] 未发现相关 less 编译器配置,请检查wepy.config.js文件. 缺少less包,npm install less -d

  6. LWIP2.0.2 & FreeRTOS & MQTT 客户端的 使用

    1.参考链接 :http://www.nongnu.org/lwip/2_0_x/group__mqtt.html 2.首先移植好lwip,然后添加lwip-2.0.2\src\apps\mqtt   ...

  7. vue04-动画、组件

    一.vue中使用动画 文档:https://cn.vuejs.org/v2/guide/transitions.html 1. Vue 中的过渡动画 <!DOCTYPE html> < ...

  8. 前端调用接口得到的数据跟postman跑出来的数据里数字部份不相等

    昨天碰到这样一个场景,调用后端接口返回的数据发现所有数据都是正常的,只有一个商品ID的最后两位是错的,每一个商品都是,导致无法进行商品的上下架和删除, 经过查资料发现: 浏览器解析数字的坑,一旦超出一 ...

  9. cuda cudnn anaconda gcc tensorflow 安装及环境配置

    1.首先,默认你已经装了适合你的显卡的nvidia驱动. 到  http://www.nvidia.com/Download/index.aspx 搜索你的显卡需要的驱动型号 那么接下来就是cuda的 ...

  10. activeMQ的request-response请求响应模式

    一:为什么需要请求响应模式 在消息中间中,生产者只负责生产消息,而消费者只负责消费消息,两者并无直接的关联.但是如果生产者想要知道消费者有没有消费完,或者用不用重新发送的时候,这时就要用到请求响应模式 ...