樹是一種非線性資料結構,是以分支關係定義的層次結構,因此形態上和自然界中的倒掛的樹很像,而資料結構中樹根向上樹葉向下。
什麼是樹?
01、定義
樹是由n(n>=0)個元素節點組成的有限集合,當n=0時,稱為空樹。
對於非空樹應滿足以下要求:
(1)有且僅有一個根節點;
(2)當n>1時,其餘節點可分成m(m>=0)個互不相交的有限集合,其中每一個集合本身又是一棵樹,稱為根的子樹。
從定義中我們可以得到以下結論:
1)樹是分支分層結構;
2)樹中僅有根節點沒有父節點;
3)除根節點外,其餘節點有且僅有一個父節點;
4)樹中每個節點,可以有零個或多個子節點;
5)根節點到任何除自身之外的節點,有且僅有一條路徑;
02、術語
1、節點相關
根節點:樹中僅存在一個根節點,位於樹的最頂層,並且其沒有父節點;
葉節點:葉節點位於樹的最末端,其下層沒有任何節點。
子節點:某個節點的下層節點,相對於該節點叫做子節點;
父節點:某個節點的上層節點,相對於該節點叫做父節點;
2、結構相關
深度:從根節點到某一節點所經過的邊的個數;根節點為0,其子節點為1,自上而下,以此類推。
高度:從某一節點到其最遠葉節點的邊數。樹的高度為根節點的高度,所有葉節點高度0,其父節點為1,自下而上,以此類推。
層次:指節點所在的層級,根節點為第0層,其子節點為第1層,自上而下,以此類推。
子樹:在一棵樹中,任何一個以某個節點為根節點的樹結構。
3、關係相關
兄弟節點:擁有共同的父節點的子節點。
祖先節點:從根節點到該節點的路徑上經歷的所有節點,除自身外,包括父節點、祖父節點等。
後代節點:該節點的所有下層節點,包括子節點、孫節點等。
4、其他術語
樹的度:指樹的寬度,也可以理解為節點的分支數,即節點的直接子節點數量,所有節點中度的最大值被視為樹的度;
路徑和路徑長度:從一個節點到另一個節點經歷的所有邊的序列即為路徑,路徑上所有邊的個數即為路徑長度;
森林:指若干棵互不相交的樹的集合;
03、二叉樹
根據節點個數我們可以把樹分成兩類:二叉樹和N叉樹。
二叉樹:每個節點最多有兩個子節點的樹;
n叉樹:每個節點最多有n個子節點的樹;
其中最常用的就是二叉樹,下面我們來詳細聊聊二叉樹。
1、定義
(1)每個節點最多有兩個子節點,分別稱為左子節點和右子節點;
(2)左右子節點所構成左子樹和右子樹也都是二叉樹;
2、性質
(1)任意一顆二叉樹樹,若節點數為n,則邊的數量為n-1;
(2)在二叉樹中,第i層最多有2^i個節點;
(3)深度為k的二叉樹,總節點數最少有2k個節點,最多有2(k+1)-1個節點;
(4)在非空二叉樹中,如果n0表示葉節點數量,n2表示度為2(即有兩個節點)的節點數量,則n0=n2+1;
3、遍歷
二叉樹遍歷指按照特定順序訪問二叉樹中所有節點,常用的遍歷方式包括:前序遍歷、中序遍歷、後序遍歷和層次遍歷。
前序遍歷
訪問順序:根節點->左子樹->右子樹
步驟:
(1)訪問根結點;
(2)前序遍歷左子樹;
(3)前序遍歷右子樹。
示意圖:
中序遍歷
訪問順序:左子樹->根節點->右子樹
步驟:
(1)中序遍歷左子樹;
(2)訪問根結點;
(3)中序遍歷右子樹。
示意圖:
後序遍歷
訪問順序:左子樹->右子樹->根節點
步驟:
(1)後序遍歷左子樹;
(2)後序遍歷右子樹;
(3)訪問根結點;
示意圖:
層次遍歷
訪問順序:第0層->第1層->……->第n層(每層從左至右依次處理)
步驟:
(1)初始化:建立一個空佇列,將根節點加入佇列;
(2)遍歷:
當佇列不為空時:
從佇列中取出一個節點,並訪問該節點的值;
如果該節點有左子節點,將左子節點加入佇列;
如果該節點有右子節點,將右子節點加入佇列;
(3)重複步驟2,直到佇列為空;
示意圖:
注:測試方法程式碼以及示例原始碼都已經上傳至程式碼庫,有興趣的可以看看。https://gitee.com/hugogoos/Planner