在二叉树的基础上,增加了以下限制条件的二叉树:
- 结点左子树上的所有结点都小于等于该结点
- 结点右子树上的所有结点都大于等于该结点
1 若要删除的结点是叶子结点,直接将结点从树中移除即可:
50 50
/ \ delete(20) / \
30 70 ---------> 30 70
/ \ / \ \ / \
20 40 60 80 40 60 80
2 若要删除的结点只有一个子结点,将子结点中的所有数据(包括子结点信息)复制到该结点中,并移除子结点:
50 50 / \ delete(30) / \ 30 70 ---------> 40 70 \ / \ / \ 40 60 80 60 80
3 若要删除的结点有两个子结点,则找出该结点的中序遍历中的后继,将其所有数据(包括子结点信息)复制到该结点中,并移除后继结点(其实用中序遍历的前趋结点也可以):
50 60
/ \ delete(50) / \
40 70 ---------> 40 70
/ \ \
60 80 80
通常我们寻找一个结点的后继时,若该结点没有右子树,则需要向上回溯。但第3种情况种,我们可以肯定要删除的结点必定有右子树,因此完全不需要回溯。