二叉查詢樹/刪除結點操作
阿新 • • 發佈:2018-12-24
資料結構自習筆記之二叉樹;
今天看到的章節為二叉查詢樹,關於刪除結點的方法,用筆記記錄;
書中介紹的方法為 複製刪除(deletion by copying)
通常來說,二叉樹結點刪除的情況有四種;
①待刪除結點(以下直接稱為結點)為葉結點, 這種情況只要直接delete;
②,③ 結點的左子樹或右子樹為空, 這兩種情況用非空子樹的結點覆蓋結點;
④結點左右子樹均為非空;
這種情況下就用到今天學習到的複製刪除;
演算法思想:
// 首先定位前驅。為此,需要向左移一步,收到先找到要刪除節點左子樹//的根,再儘可能的向右移動。之後用找到結點的鍵值替換要刪除結點的//鍵值(書中摘抄)
操作:
用結點左子樹中最右的結點中的值替換結點的值,再刪除這個最右結點,該結點的左子樹結點代替該節點原來的位置
如圖:
具體程式碼:
template<class T>
void BST<T>::deletebyCopying(BSTNode<T>* &node)
{
BSTNode<T> *previous, *temp = node;
if(0 == node->right)
node = node->left;
else if(0 == node->left)
node = node->right;
else{
temp = node-> left;
previous = node;
while(temp->right != 0){
previous = temp;
temp = temp->right;
}
node->Element = temp->Element;
if(previous == node)
previous->left = temp->left;
else
previous->right = temp->left;
}
delete temp;
}
// 才疏學淺,如有不足,多多指正