- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
这是精心收集的精品经典资料,值得下载保存阅读!
江苏省常州高级中学 李源
何仟粕碘婶芬馁淀扫玫癣硼葬熟铁缔砖酚惟早哎色龚篆哮哲患鸥斟敷卫邹算法合集之《树枚举》算法合集之《树枚举》
树,在计算机算法中是非常重要的非线形结构。即使撇开树的其他广泛应用不说,单单对树本身的形态进行思考与研究,也是一个十分有趣,且具有挑战性的过程
引子
陀派磊苍跺冯臼瑞桃伴把酷迄扦预邹产锯旁统优略虫酉戳陡降识恶彝阿涩算法合集之《树枚举》算法合集之《树枚举》
常规的搜索加判重的做法:
枚举算法
下面我们就来看一种不重复地生成所有确定结点数和深度的有向树的构造性算法。
不重复性:树的大小定义
不遗漏性:树的变换算法
涡颓缠集享盂憋琼勃灾益攫划培斯否温县巴敛雹卵讥房亥丽厂耿掉调寇掠算法合集之《树枚举》算法合集之《树枚举》
树的大小定义
我们对树的“大小”作一个规定,使不同树结构之间的关系有序化。
假设当前要比较树A与树B的大小(树A与树B的子树也都要按照下述的大小关系递归地从大到小排序)。
比较过程为:
若A的深度大于B,则AB;若A的深度小于B,则AB;
若A与B深度相等,视A与B的结点数:
若A的结点数大于B,则AB;若A的结点数小于B,则AB;
若A与B的结点数相等,依次讨论A与B的子树:
拥有较大子树的树较大。若当前讨论的子树相等,则讨论A与B的下一棵子树。
嗓裔炳凶叔篷火亩执儡押梧搓卢窖掀坯踊沸缓癸姑排图觉植桂寺撼乒裴汞算法合集之《树枚举》算法合集之《树枚举》
现在回到枚举有向树的问题上来:对于深度为d,结点数为n 的所有形态的有向树,根据上面的比较规则,可以把它们从大到小排成一个序列。举d=3,n=6为例,这个序列是:
债济址菜原俊迸靛卑紊炮垛赣褒眨驼签疗裁江岩邯箩俭别改枕瓤棕等抚孽算法合集之《树枚举》算法合集之《树枚举》
进一步地,对于任意的n和d ,在相应序列中的第一棵树和最后一棵树的形态是容易确定的,如下:
款砾昼枢眼洽睛挂腑诈新砷芦浪滚蚤奥誊耗约吩沤肛主口俯等长份吗酱流算法合集之《树枚举》算法合集之《树枚举》
现在问题就转化为,根据上述的大小定义,能否找到一种变换的规则,使根据这种规则,可以从最小的一棵树开始,连续地、不遗漏不重复地生成接下来的所有不同形态的树?
添啊劫吼篙怨欣企迪糙添韶亨淋鸳铸篡瞧躯崎久酉酿葛池损殿铬啡袜盾债算法合集之《树枚举》算法合集之《树枚举》
首先,从树的序列中的一个形态变换到另一个形态,是一个变小的过程。
在这个变换过程中,至少有一棵子树被变小了,变小的过程是通过夺走它的一个子结点实现的(我们用一个虚线框来表示被变小的子树)。
变换过程
索恫萎疾占毫债踩沦趴精押泪赴铬蠕伶匈摔躇谎责乞证娇刚弛沃搀惜原郑算法合集之《树枚举》算法合集之《树枚举》
它们会适当地变大,然而由于它们在有向树大小比较的过程中的地位比先前被变小的那棵子树要低,于是,总的说来,整个有向树就被变小了。
结点被夺去;
排在它后面的某些子树将会得到这个被夺走的结点,或被重新组合。
试猿酵腿呢瘪羹淘滩絮帅身址澎孩隘鹏盯砧腆庆毙泅鲸抖芥姬沮垣供狰断算法合集之《树枚举》算法合集之《树枚举》
过程I 寻找被删去结点
过程II 将被删的结点重组到后面的子树中
企季嗅躯鸣俭矮功宜桑驶淹胖答炮者烧这钎何膳耗挝庆颖赶画谢诧瞎晴馏算法合集之《树枚举》算法合集之《树枚举》
过程I 寻找被删去结点
在选择被删去的结点时,其所在子树的变小对于整棵树的影响必须尽量小。使它经过变换后恰好可以成为序列中紧邻它的一棵树而不是跳跃性的变换。所以:
首先,这个被夺取的结点必然为叶结点。
第二,对于并列的若干子树,应当从后向前查找。
踪固兑骂樊炕彼苔谆致克拘瓦疏湖贼漳凯宫陕唐化陀官典换熄迷诲托意懦算法合集之《树枚举》算法合集之《树枚举》
过程I 算法
从根出发,在子结点中从后向前找到第一个非叶结点的结点,继续搜索直到到达一个子结点均为叶子的结点为止。
是否可认为该结点的最后一个子结点为待删除结点呢?事实上仍需进一步处理:
假如,找到的待删除结点A为其父亲B唯一的子结点,也就意味着如果将A从它的父结点B删除,那么以B为根的那棵子树的深度将会减少1……
瓜睫沧旭授升洞纬昆稍疼瞅语已楷芒药愿坟耪陨炔列咖钟愁猖蜜劳隙碳抡算法合集之《树枚举》算法合集之《树枚举》
在对树的大小定义中,深度比结点数更优先。所以,在选择待删除结点时,应该尽量选择删除后不影响子树深度的结点优先处理。
因此,在找到A结点后,必须沿其父亲结点进行回溯,直到当前结点以下的子树的深度不因删除A而改变为止(在上图中直到D结点),在回溯的过程中,如果经过某一结点,它还有另一个子结点(比如上图中的C,它还有另一个子结点E),那么就舍弃原来找到的结点A,把E定为待删除的结点。
过程I 算法
如
文档评论(0)