二叉搜尋樹的前驅和後繼
推出一個新系列,《看圖輕鬆理解資料結構和演算法》,主要使用圖片來描述常見的資料結構和演算法,輕鬆閱讀並理解掌握。本系列包括各種堆、各種佇列、各種列表、各種樹、各種圖、各種排序等等幾十篇的樣子。
二叉搜尋樹
二叉搜尋樹(Binary Search Tree,簡寫BST),又稱為二叉排序樹,屬於樹的一種,通過二叉樹將資料組織起來,樹的每個節點都包含了健值 key、資料值 data、左子節點指標、右子節點指標。其中健值 key 是最核心的部分,它的值決定了樹的組織形狀;資料值 data 是該節點對應的資料,有些場景可以忽略,舉個例子,key 為身份證號而 data 為人名,通過身份證號找人名;左子節點指標指向左子節點;右子節點指標指向右子節點。
二叉搜尋樹特點
- 左右子樹也分別是二叉搜尋樹。
- 左子樹的所有節點 key 值都小於它的根節點的 key 值。
- 右子樹的所有節點 key 值都大於他的根節點的 key 值。
- 二叉搜尋樹可以為一棵空樹。
- 一般來說,樹中的每個節點的 key 值都不相等,但根據需要也可以將相同的 key 值插入樹中。

中序前驅節點
二叉樹通過某種方式遍歷後會得到一個序列結果,而某個節點的前驅節點就是該序列的前一個節點。由於中序遍歷得到的序列的 key 值是按從小到大順序排列的,所以在中序遍歷下,某節點的前驅就是小於該節點的所有節點中最大的那個節點。
找中序前驅節點就是找小於某個節點的最大節點。主要有三種情況:
情況一
如果某個節點存在左子節點,那麼左子節點(子樹)下中的最大 key 值節點即是前驅。看下這種情況,找“C”節點的前驅,

存在左子節點“A”,找“A”下的最大值,

找到“B”為最大值,於是“B”即為“C”節點的前驅。

情況二
如果某個節點沒有左子節點,而且如果該節點為其父節點的右子節點,那麼該節點的父節點即為該節點的前驅。看下這種情況,找“D”節點的前驅,

“D”節點沒有左子節點,且“D”為“C”節點的右子節點,所以“C”即是前驅,

情況三
如果某個節點沒有左子節點,而且如果該節點為其父節點的左子節點,那麼就往頂端尋找,直到找到一個節點是其父節點的右子節點,該父節點就是要找的前驅。看下這種情況,找“F”節點的前驅,

“F”節點沒有左子節點,且“F”節點為其父節點的左子節點,於是往頂端尋找,

“G”節點是其父節點的右子節點,於是“G”節點的父節點即為要找的前驅,即是“E”節點。

中序後繼節點
與前驅節點相應的,通過中序遍歷後會得到一個序列結果,這時某個節點的後繼節點就是該序列的後一個節點。由於中序遍歷得到的序列的 key 值是按從小到大順序排列的,所以某節點的後繼就是大於該節點的所有節點中最小的那個節點。
找中序後繼節點就是找大於某個節點的最小節點。同樣有三種情況:
情況一
如果某個節點存在右子節點,那麼右子節點(子樹)下中的最小 key 值節點即是後繼。看下這種情況,找“E”節點的後繼,

“E”節點存在右子節點“G”,找到“G”下的最小值,

最小值即一直往左找,“F”即是最小值,找到後繼。

情況二
如果某個節點沒有右子節點,而且如果該節點為其父節點的左子節點,那麼該節點的父節點即為該節點的後繼。看下這種情況,找“F”節點的後繼,

“F”節點沒有右子節點,且“F”為“G”節點的左子節點,所以“G”即是後繼,

情況三
如果某個節點沒有右子節點,而且如果該節點為其父節點的右子節點,那麼就往頂端尋找,直到找到一個節點是其父節點的左子節點,該父節點就是要找的後繼。看下這種情況,找“B”節點的後繼,

“B”節點沒有右子節點,且“B”節點為其父節點的右子節點,於是往頂端尋找,

“A”節點是其父節點的左子節點,於是“A”節點的父節點即為要找的後繼,即是“C”節點。

-------------推薦閱讀------------
我的開源專案彙總(機器&深度學習、NLP、網路IO、AIML、mysql協議、chatbot)
跟我交流,向我提問:

歡迎關注:
