数据结构与算法C++之二分搜索树的删除节点,删除任意节点

本文介绍如何在二分搜索树中删除任意节点,包括仅有一个子节点和拥有两个子节点的情况。Hibbard Deletion 方法用于处理有左右子节点的节点删除,通过找到后驱或前驱节点进行替换。
摘要由CSDN通过智能技术生成

上篇博客介绍了怎样删除二分搜索树的最大值和最小值节点,下面介绍怎样删除树的任意一个节点
上篇删除最大值节点的操作,其实删除的节点要么没有左右子节点,要么只可能有左节点,
同样,删除最小值节点的操作,其实删除的节点要么没有左右子节点,要么只可能有右节点

(1)删除只有左节点的节点,如删除节点58,只需要将58删除掉,然后将其左节点50替换其位置即可
在这里插入图片描述

(2)删除只有右节点的节点,如删除节点58,只需要将58删除掉,然后将其右节点60替换其位置即可
在这里插入图片描述
(3)删除既有左节点又有右节点的节点是最复杂的操作,在1962年,Hibbard提出了一种删除方法,称为 Habbard Deletion,如下图所示,如果需要删除既有左节点又有右节点的节点58(称为d),那么需要找出58的右节点中最小的那个节点s,那么s就是节点59,将节点59放到58的位置即可
在这里插入图片描述
具体操作步骤为,首先删除掉s节点,然后将s节点的右节点指向原来d的右节点60,将s的左节点指向原来d的左节点50
在这里插入图片描述
最后就可以彻底删除节点58了,将节点59作为新的在该位置的节点
在这里插入图片描述
下面是删除节点的程序实现

#include <iostream>
#include <vector>
#include <string>
#include <ctime>  //time()函数
#include <queue>
#include <cassert>
#include "FileOps.h"
using namespace std;

template<typename Key, typename Value>
class BST{
   

private:
    struct Node{
   
        Key key;
        Value value;
        Node *left;
        Node *right;

        Node(Key key, Value value){
   
            this->key = key;
            this->value = value;
            this->left = this->right = NULL;
        }

        Node(Node *node){
   
            this->key = node->key;
            this->value = node->value;
            this->left = node->left;
            this->right = node->right;
        }
    };

    Node *root;
    int count;

public:
    BST(){
   
        root = NULL;
        count = 0;
    }
    ~BST(){
   
        // TODO: ~BST()
        destroy(root);
    }

    int size(){
   
        return count;
    }

    bool isEmpty(){
   
        return count == 0;
    }

    void insert(Key key, Value value){
   

        root = insert(root, key, value);
    }

    bool contain(Key key){
   

        return contain
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值