- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[调研报告]P0008解题报告
《Code》0008(2-4)解题报告
长郡中学 金恺
试题翻译:
一棵二叉树既可以为空也可以含有与两棵树相连的结点。这些同一结点下的二棵树又被称为左子树和右子树。每个节点上都有一个字母表中的字母。不是子树结点的结点称作根。如果每个结点都满足下列几点,我们就称这棵树为BST:左子树上的字母在字母表中的位置要在根结点上的字母的前面,而右子树结点上的字母则要在其后面。
BST(二叉排序树的前序遍历)代码是指:
1.或者该树是一个空树(包含零个字母)则代码为一个空串;
2.或者是一串由根结点字母开始,接着是左子树字母代码,最后是右子树字母代码。
K结点的BST,这棵BST中包含英文字母表中前K个字母,假设我们有按字母表书写的代码表。(n,K)一代码是在表中第n个代码。
有14个4结点BST。它们是(按字母表顺序):
abcd abdc acbd adbc adcb bacd badc
cabd cbad dabc dacb dbac dcab dcba
badc是(7,4)一代码,该代码符合如右BST图
n,K)一代码;(n,K为正整数。1≤K≤19。)
抽象和化简:实际上,题目中讲的二叉树就是排序二叉树,而BST代码,实际上就是二叉树的先序遍历。
而题目中所要求的,就是把所有的有k个结点的排序二叉树排序的BST代码排序后(按字典顺序),排在第n位的代码。
算法设计:
倘若把所有的含k个结点的排序二叉树都求出来再对它们的BST排序,那固然可以得到题目的解,然而k的值一大,排序二叉树的数目变大,就不可能在规定时间内出解。
所以,我们必须从另外的角度来求解此题,首先,需了解一些排序二叉树的特点:
对于树中的一个点,它的子树与它合起来构成的集合总是从某个自然数开始的连续的自然数{例如:2..5};
所有的不同的排序二叉树的前序遍历结果将不同,一个BST代码亦唯一确定一棵树,即它们是一一对应的;
K个连续自然数构成的排序二叉树的个数是确定的。
如:1、2、3和3、4、5都可构成5个排序二叉树
4、如果一棵排序二叉树的根为I,这棵二叉树中的结点的编号由j…k构成,那么他的左子树的结点的编号为j…I-1,右子树的为I+1…k。
5、对于排序二叉树a与b,如果a的前序遍历的结果按字母顺序排在b的之前,则他满足①或②
a的根结点代表的数字(字母)小于b的根结点代表的数字(数字)
a的根结点代表的数字(字母)等于b的根结点代表的数字(数字),且满足③或④
a的左子树的前序遍历b的左子树的之前,
a的左子树的前序遍历b的左子树的,a的右子树的前序遍历b的右子树的之前
以上只是一些显而易见的规律(或称作性质),表面看去于题目没有太大用处,但只需这几点就能找到本题的有效算法了,具体方法如下:
一.递推法求出F[I],F[I]表示有I个结点的排序二叉树的个数。
二.用递归方法求有k个结点的第n棵排序二叉树的
不妨设k个结点的编号一次为1…k;设Xj表示根为j(1=j=k)的排序二叉树的个数。根据规律4得:
当时,根结点为1(根据规律5),否则:n(n-,当,根结点即为2,否则n(n-,以此类推,故此棵树的可以确定,设为Root;
根据性质4:若根结点为Root,则它的左子树为1..Root-1,右子树为Root+1..K
确定它的左子树(1..Root-1):
设对于Root+1..K,可构成D(易知)棵排序二叉树,则Root的左子树的每一种状态实际在原树中有D中状态与之对应,但此对求解也不会带来任何麻烦:只要把判断改成。
4.类似的确定它的右子树。只是不需要把判断改成,另外编号需改变,即求解右子树时的编号为I的结点在以他父亲为根的树中的编号为C+I;
性能分析:
时间复杂度:
空间需求:约为20N Bytes(1KB)
创新点及延伸:
可以说,这题本来就已经很有创意了,虽然这类型题目在别的考试中也已出现过。解决一类问题的关键是要有良好的分析问题的能力,并要有一定的数学基础。
启发与总结:
这一类型的题目曾多次在各类比赛中出现,比如IOI2001中的TwoFive语言。他们的共同特点是:用动态规划(或递推)算法作辅助,根据数学方法直接推出题目的解;如果用盲目的搜索,将无法在短时间内出解,足见动态规划在这类题目中的作用。
程序清单:
{$O-,P-,Q-,R-,S-}
{$M 65521,0,655360}
program Kod;
const
Fn1 = Kod.In;
Fn2 = Kod.Out;
type
Point = ^Node;
Node = record
i: Integer;
L,
文档评论(0)