能给点思路吗?

frominside 2007-04-27 12:43:34
问题描述
Farmer John 的农场上有N(1<=N<=1000)棵树。在上过计算机课后,Betsy发现所有的树实际上都是严格的二叉树。二叉树的每个非叶结点都恰好有两个子结点。Betsy给每个结点一个数表示以这个结点为根的子树的叶结点数。
然后,Betsy按照先序遍历的结果把和结点相关的数列作为它的特征序列。但是,她只列出了与根结点和所有的左子结点相关的数。例如对下面的树:
*7
/ \
/ \
/ \
*4 3
/ \ / \
*1 3 *1 2
/ \ / \
*2 1 *1 1
/ \
*1 1
用*表示的是Betsy列出的结点。这棵树的特征序列为:(7 4 1 2 1 1 1)。
在用这种方法表示完所有的树后,Betsy发现:
•所有的树有同样多的叶结点,
•所有的树有不同的特征序列,
•所有可能的严格的二叉树都在农场上。
所以,作为一个有创造力的奶牛,她决定把这些特征序列排序。给出一棵树的特征序列,求出紧接着的一个序列。

输入格式
第1行:N,特征序列的长度。
第2行:N个用空格隔开的数,表示一棵树的特征序列。

输出格式
单独的一行,表示按字典排序后所给序列的后一个序列。如果所给序列是最后一个序列,则输出0。记住:输入和输出的序列代表的树要有相同的叶结点数。

样例输入(nextree.in)
5
5 3 2 1 1

样例输出(nextree.out)
5 4 1 1 1
...全文
363 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
mlwu3 2007-04-29
  • 打赏
  • 举报
回复
从题目的描述来看的话,我觉得整个序列的排序似乎是一棵树从“右倾”向“左倾”转化的过程。

以N=5为例

第一个序列形如: 最后一个序列形如
5 5
/ \ / \
1 4 4 1
/ \ / \
1 3 3 1
/ \ / \
1 2 2 1
/ \ / \
1 1 1 1

如果是这样的话,那么最直观的做法就是:
1. 从输入的特征序列构造一棵树T
2. 将树T向左移一次
3. 如果左移成功则输出树T的特征序列;否则输出0
Eleve 2007-04-28
  • 打赏
  • 举报
回复
mark
zhou02607 2007-04-28
  • 打赏
  • 举报
回复
我的思路是特征数的第一个数字代表了他的叶结点的个数。比如说5 3 2 1 1则它有5个叶子,然后初始化5个结点,结点的值为1,1,1,1,1;然后两两结合结点,直到剩最后一个结点,两两结合的时候创造他们的父结点,父结点的值为两个子结点的值的和,剩下的最后一个结点为跟结点,然后进行先序遍历,保存每次结果,每次结果和输入最比较,比较出比输入大的最小值然后输出,若没有输出0。
这个算法只是想了下,没实践,估计复杂度挺高的。
fixphy1985 2007-04-27
  • 打赏
  • 举报
回复
没看懂题目,怎么排序的啊

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧