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节点删除节点。

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

  • 相关阅读:
    Stack堆栈的数据结构
    反坦克导弹相关网页
    Java 执行jar文件出现版本错误信息
    Python3 数字保留后几位
    Python3: Windows系统上同时安装Python2和Python3
    Linux 搭建FTP
    DBCP、c3p0、Druid三大连接池区别
    Sybase 存储过程中IF的用法
    Confluence5.8部分空间名称显示为问号的解决方案
    Mysql 更改编码方式
  • 原文地址:https://www.cnblogs.com/ITgaozy/p/5153981.html
Copyright © 2011-2022 走看看