排序二叉樹BST的基本操作 2 前驅,後繼,刪除

2021-06-18 13:57:02 字數 2199 閱讀 2462

前文中寫了基本操作中的插入,查詢,最大節點,最小節點。本文主要寫如何進行刪除。

刪除的最重要的原則是,刪除後依然要維護bst的性質,也就是說,中序遍歷後為公升序。 刪除的思路有三個。 

思路一

先理解前驅和後繼的含義。

節點key的前驅,就是中序遍歷時,比key小的所有節點中最大的那個節點。

節點key的後繼,就是中序遍歷時,比key小的所有節點中最大的那個節點。

容易看出,節點key的前驅一定沒有右兒子,可能有左兒子。反證很容易。如下圖,節點10的前驅8可能有左兒子,可能沒有左兒子。

容易看出,節點key的後繼一定沒有左兒子,可能有右兒子。反證很容易。如下圖,節點10的後繼12可能有右兒子,可能沒有右兒子。

假定要刪除的節點為key,那麼要刪除key可以用key的前驅替換key也可以用key的後繼替換key。

第一種思路,優先用key的前驅替換key,如果key沒有前驅,則用key的後繼替換key。

首先,如果key的前驅不存在,後繼也不存在。

則key是葉結點,直接刪就行。

其次,如果key的前驅存在。

要做到刪除p並且不丟掉p的左兒子並且依然維護bst的特性,可以用p的左兒子替換p,用p替換key。這個過程也巢狀了乙個刪除的過程,是乙個以p的左兒子為root的子樹上刪除p的過程,所以接下來可以看到**中遞迴的實現。(不管p的左兒子是不是null都可以這樣巢狀地刪除)

最後,如果key的前驅不存在,後繼存在,

則設key的後繼為p,那麼類似的,根據上面的結論,p一定沒有左兒子,可能有右兒子。接下來的過程和上面是對稱的。

用p的值替換key,然後在以p的右兒子為root的子樹中,刪除p,不斷巢狀刪除下去。(同樣,不管p的右兒子是不是null,這樣巢狀地刪除都合理。)

**如下

link erase(link t, int key)

else if(t->l) else

} return t;

}

思路二把上面的優先順序顛倒一下,優先刪除後繼,再刪除前驅。

link erase_3(link t, int key)

else if(t->r) else

} return t;

}

思路三來自於《clrs演算法導論》的做法。如果說上面的思路一和思路二是從節點公升序排列的角度進行的刪除,那麼思路三就是從形狀角度進行的刪除。

分3種情況處理.

(待刪除的節點key和圖a圖b圖c中的節點y是相同的節點。)

情況1  key為葉節點,則直接刪。

情況2  key只有乙個子節點,就把key給排擠掉。也就是,讓key的父節點指向key的左兒子節點(或右兒子節點),並且讓key的左子節點(或右兒子節點)的父節點指向key的父節點。如果要通過這樣的圖形形象的方式而非前面數字邏輯的方式進行刪除,那麼需要在節點結構體中增加parent指標,從而維護樹的結構。

情況3 key有兩個子節點,則找到key的後繼,然後先用key的後繼的值替換key的值,在進入到以key的後繼為root的子樹中,刪除key節點。容易根據後繼的特點知道,key的後繼沒有左兒子,所以刪除key節點,轉化為了在以key後繼為root的子樹中,進**況2的刪除。

**如下。

首先修改node結構體

typedef struct node* link;

struct node;

接下來刪除

link erase_4(link t, int key)

else

if(y!=del_node)

del_node->item = y->item;

free_node(y);

return t;

}

改造二叉樹(bst)

題目大意 給你一棵二叉樹,讓你改變最少的結點上的數值,使這棵二叉樹變成bst,求這個需要改變的最少的結點數。演算法 二分 dp 一開始就沒理解題目問的真正內涵,想了半天的樹型dp,結果肯定是果斷不對,看了題解才知道bst就是二叉樹中序遍歷之後保持有序,進一步得知其實就是要我們求lis。將這棵二叉樹中...

查詢二叉樹(BST)

今天分享一些關於bst的內容 一 基礎知識點 1 一棵樹最上面的節點稱為根節點,如果乙個節點下面連線多個節點,那麼該節點稱為父節點,它下面的節點稱為子節點。乙個節點可以有0個 1個 或多個子節點,沒有任何子節點的節點稱為葉子節點 2 以某種特定的順序訪問樹中所有的節點稱為樹的遍歷 3 樹可以分為幾個...

平衡二叉樹(BST)

二叉排序樹就查詢怎麼比二分便利了?可以是空樹 2.平衡 左子樹結點和右子樹結點的高度差絕對值不能大於1.差 平衡因子 平衡因子 只能為1,0,1 高度 當不平衡時的方法 1.左旋 步驟 將 失衡結點的 右孩子結點 77 替代需平衡結點 66 的位置 右孩子 77 的左子樹 72 變成該節點 66 的...