gpt4 book ai didi

c++ - 从二叉搜索树中删除只有一个子节点的节点

转载 作者:行者123 更新时间:2023-11-28 07:08:51 25 4
gpt4 key购买 nike

这是从二叉搜索树中删除节点的代码:我的问题是:为什么我们将节点指针通过引用传递给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()

给定以下结构

        parent
ptr1 ptr2
child1

假设我们要删除 ptr1:

基本上,DelSingle() 所做的是将 child1ptr1 交换,然后搭乘 child1 (child1 不再是 ptr1 曾经的样子)。

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

  • DelDoubleByCopying()

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

关于c++ - 从二叉搜索树中删除只有一个子节点的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21342808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com