bzoj1078

来源:互联网 发布:软件测试费用标准 编辑:程序博客网 时间:2024/06/14 05:39

看了一节课才看懂。 想到的人真的是大神啊! 首先我们去找最后插入的点 然后最后插入的点显然有两个性质

1 它是一直网左边走的点

2 它没有右子树 (脑补一下插入停止的两种情况)

 然后这显然这只是个必要条件。

然后我们考虑一个新插入的点的祖先若满足了上述性质(其实是说我们假设满足新插入的点是满足这个性质比较下面的一个点。。。)那么他的祖先在他插入之前都是只有右子树没有左子树的(除非新插入的节点是叶子节点),然后再插入新节点的话。。。那么新节点好像肯定是叶子节点。。。所以矛盾

由此得最后插入的节点,要么是满足1 2性质的深度最小节点 要么是满足1 2 性质深度最小节点的左节点(如果左节点是叶子的话)

如果你觉得这个证明不够严谨的话可以画画看。。。左节点是叶子的情况。先插自己或者是左叶子节点树的形态是一样的(好绕口)

然后为了字典序最小。所以能选左叶子节点就应该选来。否则就是满足1 2 性质的深度最小节点。

然后选定这个节点删除之后要恢复树的形态。分个类然后往上爬的过程中一直交换左右子树即可。(或者好像也可以发现左叶子节点直接把他和他父亲一直删除)

思维复杂度很高的一道题。

0 0
原创粉丝点击