美文网首页
二叉搜索树删除任意元素

二叉搜索树删除任意元素

作者: 叫我胖虎大人 | 来源:发表于2019-08-07 19:45 被阅读0次

在之前的博客中写了关于增加和删除二叉搜索树中的最值的操作.那么如何删除和增加二叉搜索树中的任意节点呢?如下.

二分搜索树删除任意节点

情况分析

被删除的节点只有一个子节点

示例01
直接使用这个子节点代替父节点

被删除的节点左右子节点都存在

  • 1).假设删除的节点为d,找到d节点右子树中的最小值(也就是比d节点大的最小值)
    (1).找到替换的节点
    s = min(d->right)
    s是d的后继,removeMin()方法会返回最小值
    (2).替换并且删除d节点,这里的删除操作实际上就是父节点的引用指向了新的子节点s ,s是新的子树的根
    s->right = removeMin(d->right)
    s -> left = d -> left

    示例02-后继替换
  • 2).假设删除的节点为d,找到d节点左子树中的最大值(也就是比d节点小的最大值)
    (1).找到替换的节点
    m = max(d->left)
    s是d的前驱,removeMax()方法会返回最大值
    (2).替换并且删除d节点,这里的删除操作实际上就是父节点的引用指向了新的子节点s ,s是新的子树的根
    s->left = removeMax(d->left)
    s -> right = d -> right

    示例02-前驱替换

代码实现

/**
     * 删除任意节点
     * @param data
     */
    public void remove(E data){
        //记录根节点位置
        root = remove(root,data);
    }

    /**
     * @param node  传入的节点
     * @param e 数值
     * @return
     */
    private Node remove(Node node,E e){
        //判断遍历完成之后找到节点没有
        if (node == null){
            return null;
        }

        //不等的情况进行递归查找

        //如果目标值比节点值小,节点向左边移动
        if (e.compareTo(node.data) < 0){
            node.left = remove(node.left,e);
            return node;

            //如果目标值比节点值大,节点向右边边移动
        }else if (e.compareTo(node.data) > 0){
            node.right = remove(node.right,e);
            return node;
        }else {

            //e == node.data,找到节点

            //左右为空时的处理
            if (node.left == null){
                Node rightNode = node.right;
                //释放内存
                node.right = null;
                size --;
                return rightNode;
            }

            if (node.right == null){
                Node leftNode = node.left;
                node.left = null;
                size--;
                return leftNode;
            }

            Node successor = getMin(node.right);
            successor.right = removeMin(node.right);
            successor.left = node.left;


            node.left = node.right = null;
            return successor;
        }
    }

相关文章

  • 5.4删除二叉搜索树的任意元素

    一.删除思路分析 在删除二叉搜索树的任意元素时,会有三种情况: 1.1 删除只有左孩子的节点 节点删除之后,将左孩...

  • 二叉搜索树删除任意元素

    在之前的博客中写了关于增加和删除二叉搜索树中的最值的操作.那么如何删除和增加二叉搜索树中的任意节点呢?如下. 二分...

  • 二叉搜索树

    二叉搜索树 定义 一棵二叉搜索树需要满足以下条件: 是一棵二叉树 对于树中任意节点,所有左子树元素都小于该节点,所...

  • 5.3 删除二叉搜索树的最大元素和最小元素

    在5.2中完成了树的遍历,这一节中将对如何从二叉搜索树中删除最大元素和最小元素做介绍:我们要想删除二分搜索树的最小...

  • 08_平衡二叉搜索树

    二叉搜索树在添加、删除节点时,都可能会导致二叉搜索树退化成链表,为了防止二叉搜索树退化成链表,让添加、删除、搜索的...

  • 力扣算法 - 删除二叉搜索树中的节点

    删除二叉搜索树中的节点 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的...

  • LeetCode 450. 删除二叉搜索树中的节点

    450. 删除二叉搜索树中的节点 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 ke...

  • 701. 二叉搜索树中的插入、搜索、删除操作

    二叉搜索树中的插入、搜索、删除操作

  • 二叉搜索树

    二叉搜索树 二叉搜索树: 又称二叉查找树、二叉排序树,是应用非常广泛的一种二叉树,简称 BST,其有如下特点:任意...

  • 19-前驱节点和后继节点

    一、前驱节点 二、后继节点 代码以二叉搜索树为例: 三、完善二叉搜索树代码,remove只针对二叉搜索树 删除代码...

网友评论

      本文标题:二叉搜索树删除任意元素

      本文链接:https://www.haomeiwen.com/subject/nuqadctx.html