您的位置:首页 > 其它

《树的枚举》的理解

2015-10-01 00:02 204 查看
友情提示:现在想想当年的东西思维太乱,基本没法读,如果你愿意建议这一次的论文由你自己先去yy一下,yy不出来再拿这个当做启发吧,现在看看感觉tm真乱,不建议看

看了两篇论文,都没源代码,表示搞不清楚他们究竟想干什么。。。文件里面不给源代码这一点真的挺坑的,像树的枚举,纠结好久才决定写一下,看步骤看的云里雾里,似乎是明白了,但是一想就觉得没法写啊。

目前有的思路是建立正序逆序两棵树,并且要想办法标记一下前面的那条链的第一个叶节点不能被删,每次找要删的点就从逆序数上从后往前找到叶子节点,并且相对第二层的不能删,如果删掉不会影响深度直接删,否则,就要用他给的神奇方法,想了下就要记录一下找到的那个叶子节点,然后回溯再搜,去找那个不会影响深度的叶子节点,如果找遍了整棵树都找不到就决定去删开始记录的点。

然后是加点了,这里我真的很气愤,你给代码啊啊啊啊!!(艹.....此处省略1k字)完全没写怎么做好不好,“使它们在满足不大于当前这棵子树的情况下变得最大”,除了这句废话我就没看到第二句信息,考虑一下弱者的感受好不好TAT。给的那个变换过程神乎其神,一开始的填边过程究竟是怎么回事,3个叶子节点怎么就突然组合成2条链了?好在另一种情况说的详细一点,对于删除结点后子树深度改变的情况,首先这肯定是一条小链,首先要将其父亲变成兄弟,两者父亲都变成祖父,记为C,然后再将C的兄弟中所有叶子节点变成他的儿子,变换完成。

首先,这是一个递归过程,从左下角开始一层一层的递归。然后我们已有的信息似乎还是在那几幅图里面,经过一番脑洞,我猜过程是这样的,还是在这个子树的范围内,每一次找点过程如前所述,填边的时候如果找到的是第一棵子树中的点,就往后找到第一个叶子节点然后把边加上,否则就新建一个兄弟叶子节点。但是后面的那幅图还说明了另一种情况,就是如果后面的兄弟级别的叶子节点数>=第一棵子树的节点数,就把这些叶子节点综合一下,合成几棵大一点的树,当然这些新生成的树还是树的初始状态,就是条链。

这些也是适用于树高的情况,如果树很高的话填边的情况会变成递归操作,代码还是不是很会写。强烈需要个代码看看,我写的话肯定会比较长且丑,现阶段也不保证没问题。

更新:后来想了一下过程其实可以简化很多,首先dfs找到需要被删除的节点,然后从那个节点往上走一下就好了,相当于在那棵子树上进行了深度为3的变换。过程的终止条件论文中提到过,要么是判断树最后的形态,要么是根据树的总数。后者听起来要简单许多,但是并没有找到公式。。百度,bing都没找到,此时的我内心是崩溃的。作者,你给我出来

我知道肯定还有许多人看的云里雾里,但是这已经是我努力后的结果了。。如果有大神给个代码看万分感谢!

深夜秋风瑟瑟
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息