2014-01-24 85 views
0

這隻有一個孩子是刪除從二叉搜索樹的節點代碼: 我的問題是:爲什麼我們參照通過該節點指針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>; 
}; 

回答

1
  • DelSingle()

鑑於follwing結構

 parent 
    ptr1 ptr2 
child1 

和S ssuming我們刪除ptr1

基本上,DelSingle()確實是ptr1交換child1,然後得到的child1乘坐(child1是不是ptr1曾經是)。

ptr通過參考,因爲你是實際上改變指針,父母的左孩子不是child1

  • DelDoubleByCopying()

你不需要通過引用傳遞節點,因爲node是不會改變的,誰改變了一個node->left(或node->right)。