前文中写了基本操作中的插入,查找,最大节点,最小节点。本文主要写如何进行删除。
删除的最重要的原则是,删除后依然要维护BST的性质,也就是说,中序遍历后为升序。 删除的思路有三个。
思路一
先理解前驱和后继的含义。
节点key的前驱,就是中序遍历时,比key小的所有节点中最大的那个节点。
节点key的后继,就是中序遍历时,比key小的所有节点中最大的那个节点。
容易看出,节点key的前驱一定没有右儿子,可能有左儿子。反证很容易。如下图,节点10的前驱8可能有左儿子,可能没有左儿子。
容易看出,节点key的后继一定没有左儿子,可能有右儿子。反证很容易。如下图,节点10的后继12可能有右儿子,可能没有右儿子。
假定要删除的节点为key,那么要删除key可以用key的前驱替换key也可以用key的后继替换key。
第一种思路,优先用key的前驱替换key,如果key没有前驱,则用key的后继替换key。
首先,如果key的前驱不存在,后继也不存在。
则key是叶结点,直接删就行。
其次,如果key的前驱存在。
要做到删除p并且不丢掉p的左儿子并且依然维护BST的