细说二叉树的删除操作

  二叉树的删除有很多种方法,只要删除后满足二叉树的性质即可。我们先看先看一颗二叉树。

例如我们要删除20这个节点。

1、把30变成根,10变成25的左孩子。

2、把10变成根,30变成10的右孩子。

这两种办法都可以达到删除20的节点目的。

我们可以这么做,是由二叉树的性质决定的。

仔细观察这个树,我们会发现,20的左孩子都小于它,20的右孩子都大于它。所以经过1或2的操作,二叉树的性质并没有变。

当然不止这两种方法,接下来介绍红黑树中使用的删除方法。

还是以第一幅图为例,删除20节点。但在这里并不是删除20这个节点,而是找到一个适当的节点来替换20这个节点。

这棵树中,我们还是可以找到两个点来替换20这个节点。10或者25。

那么我们是怎么找到这两个点的呢?

1、从删除节点的左子树找,找左子树中最大的节点。

  比如x是删除节点,他有左右孩子,Node *y = x->left; while (y->right != NULL ) y=y->right; 这样y就是x的左子树中的最大值。

2、从删除节点的右子树找,找右子树中最小的节点。

  操作与找最大节点类似,把left变成right。

找到这个替换节点后,将替换节点的其他信息替换成删除节点(值的信息除外)。这个替换节点,就是之前说的真正的删除节点。而20节点删除节点。

无论哪种方法,都是为了维持二叉树的性质,只要在我们的操作之后,还能保持二叉树的性质,那我们的操作就算完成了。其次我们尽量让代码简洁易懂。

原文地址:https://www.cnblogs.com/ITgaozy/p/5153981.html