在点p的左右子树同时存在时,程序要用左子树中的最大的元素,即p的左子树中最右边的元素替代p。while循环的用途就是找到这个最右边的元素。但是这个元素可能是p的左孩子本身,即p的左孩子没有右子树。这种情况下,q与p均指向需要删除的节点,这个结点已经复制了其左孩子s的值,所以删除节点s即可。照片中第一行红线处理的是p的左孩子有右子树的情况,而第二行处理的是没有右子树的情况。
因为有可能该删除的节点下面的左子树没有右子树的情况。如下(其中O是待删除的节点,O 下面有左右子树L、R,但L下面没有右子树,这种情况下,直接把L的左子树,也就是A提上来即可)
--------------------根
------------------/-----\
----------------O-------X
---------------/----\
-------------L-------R
----------/
--------A