資料結構 - 樹,初探

IT规划师發表於2024-10-16

樹是一種非線性資料結構,是以分支關係定義的層次結構,因此形態上和自然界中的倒掛的樹很像,而資料結構中樹根向上樹葉向下。

什麼是樹?

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

相關文章