JAVA中在 HahsMap 中,在JDK1.8之後,就出現了紅黑樹,那麼我們就得研究一下這個資料結構了,畢竟框架都是對底層進行的封裝,那麼我們一起看一下吧。
二叉樹
二叉樹:二叉樹是每個節點最多有2個子樹的一種資料結構。
我們畫圖來了解一下吧,畢竟畫圖比較清晰。
二叉樹的最高層就是根節點,下面又有很多的子節點,25是15的父節點,而15又是25的子節點,其實就是一個相互的關係, 而15和44又是兄弟節點,但是有一點我們需要注意的地方就是葉子節點, 葉子節點則是紅框裡面的節點,就是沒有子節點的我們就稱它為葉子節點。
而在二叉樹中,我們還要理解一個概念,這個概念就是“樹的深度”
樹深度:從根節點開始(深度為0)自最高層往下遞增,在上面的圖中我們可以知道,25的深度是0, 15和44深度是1,10,20,21和27的樹深度是2,依次會遞增。
這是二叉樹的幾個我們需要了解的概念性的知識。
而二叉樹也是有分類的:
滿二叉樹
除最後一層無任何子節點外,每一層上的所有節點都有兩個子節點,最後一層都是葉子節點。
1.假設我們樹的深度是h,最大層數是k,那滿二叉樹就是h=k。
2.而我們滿二叉樹的葉子節點數也就是最後面的一層是2的k-1次方。
3.而二叉樹的總節點數也一點會是奇數。
這也是滿二叉樹的性質。
完全二叉樹
若設二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊,這就是完全二叉樹。
我們來看看圖
1.完全二叉樹只允許最後一層有空缺結點且空缺在右邊,即葉子節點只能在層次最大的兩層上出現;
2.而且對任意一個節點,如果其右子樹的深度為j,則其左子樹的深度必為j或j+1 即度為1的點只有1個或0個;
3.有n個節點的完全二叉樹,其深度為:log2的n+1次方;
4.滿二叉樹一定是完全二叉樹,完全二叉樹不一定是滿二叉樹。
平衡二叉樹
又被稱為AVL樹,它是一顆空樹或左右兩個子樹的高度差的絕對值不超過 1,並且左右兩個子樹都是一棵平衡二叉樹。
我們看一下圖
二叉搜尋樹
二叉搜尋樹又稱二叉查詢樹、二叉排序樹(Binary Sort Tree)。
我們來看看它又是什麼鬼樣子。
1.二叉搜尋樹若左子樹不空,則左子樹上所有節點的值均小於或等於它的根節點的值;
2.左、右子樹也分別為二叉排序樹;
3.若右子樹不空,則右子樹上所有節點的值均大於或等於它的根節點的值;
還有就是在HashMap裡面存在的紅黑樹。
紅黑樹
紅黑樹就是每個節點都帶有顏色屬性,顏色或者是紅色或者是黑色的平衡二叉查詢樹, 我們看看它是什麼樣子滴。
1.紅黑樹節點是紅色或黑色;
2.根節點是黑色;
3.所有葉子節點都是黑色;
4.從任一節點到其每個葉子的所有簡單路徑都包含相同數目的黑色節點。
5.每個紅色節點必須有兩個黑色的子節點。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)
我們再來看一下這個樹結構是怎麼實現遍歷的?
二叉樹遍歷分為前序、中序、後序遞迴和非遞迴遍歷、還有層序遍歷。
用程式碼解釋肯定是不太可能,畢竟程式碼寫出來的都是模仿寫的, 我們用畫圖來解釋:
為什麼會叫這個名字?是根據根節點的順序命名的。
我們用最簡單的圖:
比如上圖正常的一個滿節點,A:根節點、B:左節點、C:右節點;
前序順序是ABC(根節點排最先,然後同級先左後右);
中序順序是BAC(先左後根最後右);
後序順序是BCA(先左後右最後根)。
在我們上圖中,見我們的前序,中序,後序遍歷結構是什麼呢?
前序遍歷:A B C D E F G H I
中序遍歷:B D C A E H G I F
後序遍歷:D C B H I G F E A
總結
二叉樹是一棵樹,且每個節點都不能有多於兩個的兒子,且二叉樹的子樹有左右之分,次序不能顛倒。 二叉樹的遍歷分為以下三種:
先序遍歷:遍歷順序規則為根左右
中序遍歷:遍歷順序規則為左根右
後序遍歷:遍歷順序規則為左右根
Java 極客技術公眾號,是由一群熱愛 Java 開發的技術人組建成立,專注分享原創、高質量的 Java 文章。如果您覺得我們的文章還不錯,請幫忙讚賞、在看、轉發支援,鼓勵我們分享出更好的文章。
關注公眾號,大家可以在公眾號後臺回覆“部落格園”,免費獲得作者 Java 知識體系/面試必看資料。