关于有序二叉树的删除,从大方面分为三种:删除叶子节点、删除只有一棵子树的节点和删除有两颗子树的节点。
一、删除叶子节点
1、找到要删除的节点(目标节点target)。
2、找到要删除节点的父节点(parent)。
(1)如果没有父节点,令root=null。
(2)如果有父节点,判断目标节点是父节点的左孩子还是右孩子。如果是左孩子,令parent.left=null;同理,如果是右孩子,令parent.right=null。
二、删除只有一棵子树的节点
1、找到要删除的节点(目标节点target)。
2、找到要删除节点的父节点(parent)。
(1)如果没有父节点,判断目标节点有左子树还是右子树。
(2)如果有父节点 ,判断目标节点是父节点的左孩子还是右孩子,再继续判断目标节点有左子树还是右子树。
三、删除有两颗子树的节点
1、找到要删除的节点(目标节点target)。
2、找到目标节点左子树的最大值或右子树的最小值。
3、目标节点左子树的最大值或右子树的最小值替换掉目标节点的值。
4、删除目标节点左子树的最大值或右子树的最小值。(根据有序二叉树的性质和特点,不论是目标节点左子树的最大值还是右节点的最小值,都要么是叶子节点,要么只有一棵子树,其删除方法见前两项)。
(思路:想要删除有两颗子树的节点,且保证有序二叉树的结果不变,则需找到一个值来替换掉目标节点的值,并且要满足该值比左子树的值都大,比右子树的值都小,因此,可用目标节点左子树的最大值或右子树的最小值来替换掉目标节点的值。)