什麼是樹?
“樹”這種數據結構類似於我們生活中的“樹”,樹裏面的每個元素我們稱之爲“節點”;用來連接相鄰節點之間的關係,我們叫作“父子關係”。關於樹,有幾個相關的概念:高度(Height)、深度(Depth)、層(Level)。它們的定義是:
節點的高度 = 節點到葉子節點的最長路徑
節點的深度 = 根節點到這個葉子節點所經歷的邊的個數
節點的層數 = 節點的深度 + 1
樹的高度 = 根節點的高度
如下圖:
二叉樹(Binary Tree)
二叉樹,顧名思義,每個節點最多倆個“叉”,也就是兩個節點,分別是左子節點和右子節點。不過,二叉樹不要求每個節點都有倆個節點,有的節點只有左子節點;有的節點只有右子節點;有的節點既沒有左子節點,又沒有右子節點,這種節點稱之爲葉子節點。如下圖:
上圖中有三種二叉樹,其中編號2和3這兩個二叉樹比較特殊。
編號2的二叉樹中,葉子節點都在最低層,除了葉子節點之外,每個節點都有左右兩個子節點,這種二叉樹叫作滿二叉樹。
編號3的二叉樹中,葉子節點都在最底下兩層,最後一層的葉子節點都靠左排列,並且除了最後一層,其他層的節點個數都要達到最大,這種二叉樹叫作完全二叉樹。
如何表示(或者存儲)一棵二叉樹
想要存儲一棵二叉樹,我們有兩種方法,一種是基於指針或者引用的二叉鏈式存儲法,大部分二叉樹代碼都是通過這種結構實現的。而另一種則是基於數組的順序存儲法。
如果某棵二叉樹是一棵完全二叉樹,那用數組存儲無疑是最節省內存的一種方式。因爲數組的存儲方式並不像鏈式存儲那樣,要存儲額外的左右子節點的指針。這也是完全二叉樹爲什麼要求最後一層的子節點都靠左的原因。堆,其實就是一種完全二叉樹,最常用的存儲方式是數組。
總之:二叉樹既可以用鏈式存儲,也可以用數組存儲。數組順序存儲的方式比較適合完全二叉樹,其它類型的二叉樹用數組存儲會比較浪費空間。除此之外,二叉樹李非常重要的操作就是前、中、後序遍歷操作,遍歷的時間複雜度是O(n)。
二叉樹最大的特點:
支持動態數據集合的快速插入、刪除、查找操作。