推出一個新系列,《看圖輕鬆理解數據結構和算法》,主要使用圖片來描述常見的數據結構和算法,輕鬆閱讀並理解掌握。本系列包括各類堆、各類隊列、各類列表、各類樹、各類圖、各類排序等等幾十篇的樣子。mysql
對於樹的數據結構你們都瞭解,只是樹的類型有不少,因此可能又會對樹產生一種陌生感。樹其實就是由有限n(n>=1)個節點組成的一個具備層次關係的集合,它看起來像一棵倒掛的樹,因此稱之爲「樹」。算法
二叉搜索樹(Binary Search Tree,簡寫BST),又稱爲二叉排序樹,屬於樹的一種,經過二叉樹將數據組織起來,樹的每一個節點都包含了健值 key、數據值 data、左子節點指針、右子節點指針。其中健值 key 是最核心的部分,它的值決定了樹的組織形狀;數據值 data 是該節點對應的數據,有些場景能夠忽略,舉個例子,key 爲身份證號而 data 爲人名,經過身份證號找人名;左子節點指針指向左子節點;右子節點指針指向右子節點。sql
對於下面這棵樹,插入D
和H
,網絡
建立D
節點並與根節點比較,數據結構
D 小於 E,因而往左子節點繼續比較,併發
D 大於 C,應該往右子節點方向,而此時 C 節點的右子節點指針爲空,D 節點能夠放置進去。機器學習
一樣的,對於 H 節點,先建立 H 節點並與根節點比較,數據結構和算法
H 大於 E,因而往右子節點繼續比較,學習
H 大於 G,應該往右子節點方向,而此時 G 節點的右子節點指針爲空,H 節點能夠放置進去。.net
二叉搜索樹的形狀與節點插入順序不一樣而可能不一樣,好比對於A B C D E F G H
這些節點集,按E C A B D G F H
順序插入則爲,
而若是調換前面兩個節點,按照C E A B D G F H
順序插入則以下圖,形狀差異仍是挺大的,
極端狀況下,按照A B C D E F G H
順序插入,則爲,
對於下圖的樹查找 key 值爲「B」和「G」的節點,
「B」與根節點的 key 值比較,
「B」小於「E」,往左子節點繼續尋找,
「B」小於「C」,往左子節點繼續尋找,
「B」大於「A」,往右子節點繼續尋找,二者相等,找到。
繼續查詢 key 值爲「G」的節點,與根節點比較,
「G」大於「E」,往右子節點,二者相等,找到。
刪除操做分三種狀況進行,
1 2 3 4 5
中4就是3的後繼。前驅就是刪除節點前面那個節點,好比1 2 3 4 5
中2就是3的前驅。刪除「B」葉子結點,從根節點開始查找,
找到,直接刪除,
假如樹的結構以下圖,如今要刪除「C」節點,
從根節點開始找,
找到「C」節點,直接將原來指向「C」節點的右子節點指針指向「C」的子節點,
最終爲,
要在以下的樹中刪除「E」節點,
「E」節點存在兩個子節點,因而開始尋找「E」節點的中序前驅來替換它,前驅在左子節點「C」下最大值的那個節點,
要找「C」節點下最大值節點則一直往右,
直到不能繼續往下,即「D」節點便是前驅,用「D」節點來替換「E」節點,
最終實現將「E」節點刪除。
-------------推薦閱讀------------
個人開源項目彙總(機器&深度學習、NLP、網絡IO、AIML、mysql協議、chatbot)
跟我交流,向我提問:
歡迎關注: