今天学习二叉搜索树的时候,在删除节点的章节看到了两种写法。
第一种写法是记录该节点值存在的次数 cntcntcnt。然后直接惰性删除。方法来自 Pecco 算法学习笔记(45): 二叉搜索树:
这里直接采取惰性删除的方法:找到要删除的数,令其计数-1。这样写起来比较简单,不用进行较复杂的分类讨论,而且不会增加时间复杂度。
第二种写法是来自 OI Wiki 以及 lyd 蓝书的写法。笼统地说,它们进行了替换。OI Wiki 二叉搜索树 & 平衡树。
若 ooo 为叶子节点,直接删除该节点即可。 若 ooo 为链节点,即只有一个儿子的节点,返回这个儿子。 若 ooo 有两个非空子节点,一般是用它左子树的最大值或右子树的最小值代替它,然后将它删除。
感觉第一个方法要好写一些。请问一下,当应用在平衡树中的时候,哪一个效率好一些?或者说,这两种方法有没有可能其中之一会被卡?