1. 程式人生 > >二叉查詢樹/刪除結點操作

二叉查詢樹/刪除結點操作

資料結構自習筆記之二叉樹;
今天看到的章節為二叉查詢樹,關於刪除結點的方法,用筆記記錄;
書中介紹的方法為 複製刪除(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; }

// 才疏學淺,如有不足,多多指正