[英]Deleting a node with only one child from a Binary Search Tree
這是從二叉搜索樹刪除節點的代碼:我的問題是:為什么我們按引用傳遞的節點指針以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()
確實是交換child1
與ptr1
,然后得到的乘坐child1
( child1
是不是ptr1
曾經是)。
ptr
通過引用傳遞,因為您實際上是在更改指針 ,父級的左子級不是child1
。
DelDoubleByCopying()
您不需要逐個引用傳遞節點,因為node
不會更改,更改的node->left
是node->left
(或node->right
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.