二叉樹
二叉樹是一個特殊的樹型結構,有一下的特點:
- 最多有 2 個子節點,稱爲左節點和右結點。
- 左右節點的次序不能顛倒,即使只有一個節點也需要區分是左子節點或者右子節點。
沒有子節點的節點稱爲葉子節點。
完全二叉樹
在二叉樹的基礎上,n 層的完全二叉樹,所有的葉子節點都在第 n 層或者 n - 1 層。
同時左右子節點需要連續。
滿二叉樹
在二叉樹的基礎上,所有的葉子節點都在最後一層。根節點的左右子樹沒有高度差。
二叉樹的遍歷
遍歷的時候,中序、前序和後序遍歷的時候,是看根節點出現在哪裏來判斷的。根節點第一個出現是前序遍歷。
深度優先和廣度優先
深度優先用棧實現。利用後進先出的特點。
廣度優先用隊列實現,利用先進先出的特點。
堆
堆,分爲最小堆和最大堆。堆的特性是,首先是一個完全二叉樹,然後向樹裏面添加節點的時候,需要調整這個二叉樹,如果新加入的節點比堆父節點小或者大的,就和父節點交換,直到堆頂。
堆可以用數組表示,下標從 1 開始,左右子節點分別爲 2 * i
和 2 * i + 1
。
堆適合查找一堆數據裏面 top k 大或者小的數據的場景,比如從10億數據裏面找到前 100 大的數,這個時候就可以用最小堆來做,構造一個容量爲 100 的最小堆,然後遍歷 10 億的數據,然後嘗試往堆裏面添加數據,當堆滿了的時候,和堆頂比較,比堆頂小的話,什麼都不做,當比對頂大的話,先查找堆裏面是否已經有了這個數(看要求,如果允許重複的數,那麼就不用查找,如果不允許重複,就需要去重),如果有了就什麼都不做,如果沒有,就替換堆頂,調整堆。
二叉查找樹
某個節點的值比他的左子節點的值大,比他的右子節點的值小。可以簡單記憶爲,父節點大於所有的左子樹的節點,父節點小於所有的右子樹節點。
基於這個特性查找某個數比較方便。
平衡二叉查找樹
當一組數據有序的時候,二叉查找樹會變成一個鏈表,失去了高效查詢的效率。平衡二叉樹規定,根節點的左右子樹的高度差不超過 1 ,超過 1 的時候需要自旋,以保證左右子樹高度差不超過 1.
AVL 樹
AVL 樹是平衡二叉查找樹的一種實現,定義如下
- 每個節點的左子樹和右子樹都是 AVL 樹
- 左子樹和右子樹的高度差不超過 1
特性
添加刪除節點後都需要從新平衡
紅黑樹
紅黑樹也是平衡二叉查找樹的一種實現。紅黑樹的特性如下
- 一個節點,要麼是紅色,要麼是黑色
- 根節點爲黑色
- 每個葉子節點(沒有子節點的節點)都是黑色