二叉搜索樹的前驅和後繼

前言

推出一個新系列,《看圖輕鬆理解數據結構和算法》,主要使用圖片來描述常見的數據結構和算法,輕鬆閱讀並理解掌握。本系列包括各類堆、各類隊列、各類列表、各類樹、各類圖、各類排序等等幾十篇的樣子。mysql

二叉搜索樹

二叉搜索樹(Binary Search Tree,簡寫BST),又稱爲二叉排序樹,屬於樹的一種,經過二叉樹將數據組織起來,樹的每一個節點都包含了健值 key、數據值 data、左子節點指針、右子節點指針。其中健值 key 是最核心的部分,它的值決定了樹的組織形狀;數據值 data 是該節點對應的數據,有些場景能夠忽略,舉個例子,key 爲身份證號而 data 爲人名,經過身份證號找人名;左子節點指針指向左子節點;右子節點指針指向右子節點。算法

二叉搜索樹特色

  • 左右子樹也分別是二叉搜索樹。
  • 左子樹的全部節點 key 值都小於它的根節點的 key 值。
  • 右子樹的全部節點 key 值都大於他的根節點的 key 值。
  • 二叉搜索樹能夠爲一棵空樹。
  • 通常來講,樹中的每一個節點的 key 值都不相等,但根據須要也能夠將相同的 key 值插入樹中。

image

中序前驅節點

二叉樹經過某種方式遍歷後會獲得一個序列結果,而某個節點的前驅節點就是該序列的前一個節點。因爲中序遍歷獲得的序列的 key 值是按從小到大順序排列的,因此在中序遍歷下,某節點的前驅就是小於該節點的全部節點中最大的那個節點。sql

找中序前驅節點就是找小於某個節點的最大節點。主要有三種狀況:網絡

狀況一

若是某個節點存在左子節點,那麼左子節點(子樹)下中的最大 key 值節點便是前驅。看下這種狀況,找「C」節點的前驅,數據結構

image

存在左子節點「A」,找「A」下的最大值,併發

image

找到「B」爲最大值,因而「B」即爲「C」節點的前驅。機器學習

image

狀況二

若是某個節點沒有左子節點,並且若是該節點爲其父節點的右子節點,那麼該節點的父節點即爲該節點的前驅。看下這種狀況,找「D」節點的前驅,數據結構和算法

image

「D」節點沒有左子節點,且「D」爲「C」節點的右子節點,因此「C」便是前驅,學習

image

狀況三

若是某個節點沒有左子節點,並且若是該節點爲其父節點的左子節點,那麼就往頂端尋找,直到找到一個節點是其父節點的右子節點,該父節點就是要找的前驅。看下這種狀況,找「F」節點的前驅,.net

image

「F」節點沒有左子節點,且「F」節點爲其父節點的左子節點,因而往頂端尋找,

image

「G」節點是其父節點的右子節點,因而「G」節點的父節點即爲要找的前驅,便是「E」節點。

image

中序後繼節點

與前驅節點相應的,經過中序遍歷後會獲得一個序列結果,這時某個節點的後繼節點就是該序列的後一個節點。因爲中序遍歷獲得的序列的 key 值是按從小到大順序排列的,因此某節點的後繼就是大於該節點的全部節點中最小的那個節點。

找中序後繼節點就是找大於某個節點的最小節點。一樣有三種狀況:

狀況一

若是某個節點存在右子節點,那麼右子節點(子樹)下中的最小 key 值節點便是後繼。看下這種狀況,找「E」節點的後繼,

image

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

image

最小值即一直往左找,「F」便是最小值,找到後繼。

image

狀況二

若是某個節點沒有右子節點,並且若是該節點爲其父節點的左子節點,那麼該節點的父節點即爲該節點的後繼。看下這種狀況,找「F」節點的後繼,

image

「F」節點沒有右子節點,且「F」爲「G」節點的左子節點,因此「G」便是後繼,

image

狀況三

若是某個節點沒有右子節點,並且若是該節點爲其父節點的右子節點,那麼就往頂端尋找,直到找到一個節點是其父節點的左子節點,該父節點就是要找的後繼。看下這種狀況,找「B」節點的後繼,

image

「B」節點沒有右子節點,且「B」節點爲其父節點的右子節點,因而往頂端尋找,

image

「A」節點是其父節點的左子節點,因而「A」節點的父節點即爲要找的後繼,便是「C」節點。

image

-------------推薦閱讀------------

個人開源項目彙總(機器&深度學習、NLP、網絡IO、AIML、mysql協議、chatbot)

爲何寫《Tomcat內核設計剖析》

2018彙總數據結構算法篇

2018彙總機器學習篇

2018彙總Java深度篇

2018彙總天然語言處理篇

2018彙總深度學習篇

2018彙總JDK源碼篇

2018彙總Java併發核心篇

2018彙總讀書篇


跟我交流,向我提問:

歡迎關注:

相關文章
相關標籤/搜索