从二进制搜索树中删除只有一个孩子的节点

Deleting a node with only one child from a Binary Search Tree

本文关键字:有一个 孩子 节点 删除 二进制 搜索树      更新时间:2023-10-16

这是从二进制搜索树删除节点的代码:我的问题是:为什么我们要通过参考将节点指针传递到DelSingle函数,但我们仅将节点指针传递给DelDoubleByCopying函数?

template <class T>
bool BST<T>::DeleteNode(T& val)
{
BSTNode<T> * node = root, *prev = NULL;
if (IsEmpty() == true)
    return false;
while (node != NULL)
{
    if (node->val == val)
        break;
    prev = node;
    if (val < node->val)
        node = node->left;
    else
        node = node->right;
}
if (node == NULL)
    return false;
if (node->left == NULL || node->right == NULL)
{
    if (node == root)
        DelSingle(root);
    else if(node == prev->left)
        DelSingle(prev->left);
    else
        DelSingle(prev->right);
}
else
    DelDoubleByCopying(node);
return true;
}
template <class T>
void BST<T>::DelSingle(BSTNode<T>*& ptr)
{
BSTNode<T>* delNode = ptr;
if(delNode->left == NULL) // node does not have a left child
    ptr = delNode->right;
else if(delNode->right == NULL) // node does not have a right child
    ptr = delNode->left;
delete delNode;
}
template <class T>
void BST<T>::DelDoubleByCopying(BSTNode<T>* node)
{
BSTNode<T> *prev, *rep;
rep = node->left;  //Find the largest child in the left subtree
prev = node;
while (rep->right != NULL)
{
    prev = rep;
    rep = rep->right;
}
node->val = rep->val;
if (prev == node)
    prev->left = rep->left;
else
    prev->right = rep->left;
delete rep;
}

这是二进制搜索树节点的类别:

template <class T>
class BSTNode
{ 
public:
BSTNode(T& val, BSTNode* left, BSTNode* right);
~BSTNode();
T GetVal();
BSTNode* GetLeft();
BSTNode* GetRight();
private:
T val;
BSTNode* left;
BSTNode* right;
int depth, height;
friend class BST<T>;
};
  • DelSingle()

给定Follwing结构

        parent
    ptr1    ptr2
child1

和sssuming我们正在删除 ptr1

基本上,DelSingle()的作用是将child1ptr1交换,然后获得child1的骑行(child1不是ptr1一次)。

ptr是通过引用传递的,因为您是实际更改指针,父母的左子女不是child1

  • DelDoubleByCopying()

您不需要通过引用传递节点,因为node不会更改,更改的是node->left(或node->right)。

相关文章: