推出一個新系列,《看圖輕鬆理解數據結構和算法》,主要使用圖片來描述常見的數據結構和算法,輕鬆閱讀並理解掌握。本系列包括各類堆、各類隊列、各類列表、各類樹、各類圖、各類排序等等幾十篇的樣子。mysql
二叉搜索樹(Binary Search Tree,簡寫BST),又稱爲二叉排序樹,屬於樹的一種,經過二叉樹將數據組織起來,樹的每一個節點都包含了健值 key、數據值 data、左子節點指針、右子節點指針。其中健值 key 是最核心的部分,它的值決定了樹的組織形狀;數據值 data 是該節點對應的數據,有些場景能夠忽略,舉個例子,key 爲身份證號而 data 爲人名,經過身份證號找人名;左子節點指針指向左子節點;右子節點指針指向右子節點。算法
二叉樹經過某種方式遍歷後會獲得一個序列結果,而某個節點的前驅節點就是該序列的前一個節點。因爲中序遍歷獲得的序列的 key 值是按從小到大順序排列的,因此在中序遍歷下,某節點的前驅就是小於該節點的全部節點中最大的那個節點。sql
找中序前驅節點就是找小於某個節點的最大節點。主要有三種狀況:網絡
若是某個節點存在左子節點,那麼左子節點(子樹)下中的最大 key 值節點便是前驅。看下這種狀況,找「C」節點的前驅,數據結構
存在左子節點「A」,找「A」下的最大值,併發
找到「B」爲最大值,因而「B」即爲「C」節點的前驅。機器學習
若是某個節點沒有左子節點,並且若是該節點爲其父節點的右子節點,那麼該節點的父節點即爲該節點的前驅。看下這種狀況,找「D」節點的前驅,數據結構和算法
「D」節點沒有左子節點,且「D」爲「C」節點的右子節點,因此「C」便是前驅,學習
若是某個節點沒有左子節點,並且若是該節點爲其父節點的左子節點,那麼就往頂端尋找,直到找到一個節點是其父節點的右子節點,該父節點就是要找的前驅。看下這種狀況,找「F」節點的前驅,.net
「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)
跟我交流,向我提問:
歡迎關注: