en造数据结构与算法C# 之 二叉排序树的删除

en造数据结构与算法C# 之 二叉排序树的增/查-CSDN博客

删除方法比起添加和查找就稍显复杂了 ,所以单独拿出来写一篇

分析

输入

1.根节点,用于从根上查找你要删除的节点

2.需要删除的值

   public Node<T> Delete(Node<T> root, T data) {
       if (root == null)
           return root;

删除节点比如,比如我有一个如下的二叉树

 1.找到最后,要删除的节点是叶子节点

删除20

2.找到最后,要删除的节点只有一个子节点

删除70,我们会发现

3.找到最后,发现要删除的节点的子树是满的,左右叶子都有

那就需要从该节点的右子树去找最小值替换该位置

所以,从程序上来讲的话,需要分一个状态+两种情况

一个状态 = 找到需要删除的位置

两种情况 = 1.要删除的是叶子节点或者只有一个子节点 + 2.左右子节点都存在

上代码


    /// <summary>
    /// 删除节点
    /// </summary>
    /// <param name="root">根节点</param>
    /// <param name="data">需要删除值</param>
    /// <returns></returns>
    public Node<T> Delete(Node<T> root, T data) {
        if (root == null)
            return root;

        // 找到要删除的节点
        if (data.CompareTo(root.data) < 0)
            root.LeftNode = Delete(root.LeftNode, data);
        else if (data.CompareTo(root.data) > 0)
            root.RightNode = Delete(root.RightNode, data);
        else {
            // 情况1:节点是叶子节点或只有一个子节点
            if (root.LeftNode == null)
                return root.RightNode;
            else if (root.RightNode == null)
                return root.LeftNode;

            // 情况2:节点有两个子节点
            // 找到右子树中的最小值节点
            root.data = MinValue(root.RightNode);
            // 删除右子树中的最小值节点
            root.RightNode = Delete(root.RightNode, root.data);
        }

        return root;
    }

    private T MinValue(Node<T> root) {
        T minValue = root.data;
        while (root.LeftNode != null) {
            minValue = root.LeftNode.data;
            root = root.LeftNode;
        }
        return minValue;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值