zoukankan      html  css  js  c++  java
  • 细说二叉树的删除操作

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

    例如我们要删除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节点删除节点。

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

  • 相关阅读:
    leetcode18
    CSS 1. 选择器
    HTML
    练习题|MySQL
    练习题||并发编程
    第八章| 3. MyAQL数据库|Navicat工具与pymysql模块 | 内置功能 | 索引原理
    mysql练习
    第八章| 2. MySQL数据库|数据操作| 权限管理
    第八章| 1. MySQL数据库|库操作|表操作
    第七章|7.4并发编程| I/O模型
  • 原文地址:https://www.cnblogs.com/ITgaozy/p/5153981.html
Copyright © 2011-2022 走看看