樹
多年前,還是一個對計算機懵懵懂的少年,學了一門猶如天書般的課程叫資料結構,課程裡面每個知識點在當時來說是異常抽象。畢業後寫了幾年程式碼,再次學習一下資料結構中的一個重要概念--樹。
思考:如何理解資料結構的概念?
資料結構是指相互之間存在一種或多種特定關係的資料元素集合在計算機中組織和儲存的方式。我個人覺著也可以理解為資料結構是現實世界中關係實體在計算機世界中的一種抽象描述。
樹是一種計算機世界中的資料結構,其中一個結點元素可以對應兩個或多個子結點元素,具有一對多的特點,下面是一些關於“樹”的概念。- 結點的度:子結點的個數。上圖中node1有3個子結點,故其度為3。
- 樹的度:樹的度等於所有結點度最高的值。結點最高的度為3,樹的度為3。
- 葉子結點:度為0的結點,即沒有子結點的結點。上圖中node4,node5,node6,node7為葉子結點。
樹的儲存
“樹”這種資料結構是我們用計算機對現實世界中關係實體的抽象描述,那麼這種描述在計算機記憶體中的儲存需要進一步轉換為記憶體可以解析的結構。計算機記憶體中可以解析的“儲存結構”有兩種,順序表(連續儲存空間)和連結串列(非連續儲存空間)。
1 雙親表示法(順序儲存結構)
順序儲存用一組連續的記憶體空間來儲存樹的結點,同時在每個結點中附加一個標識(整數型別),用於指示雙親結點的位置(下標值),如下圖所示。
記憶體中的順序表一般對應我們程式(高階語言)中的陣列(Array),那麼上面樹的雙親表示法JavaScript描述見下面程式碼。// JavaScript
[
{value: 'node1', parent: -1},
{value: 'node2', parent: 0},
{value: 'node3', parent: 0},
{value: 'node4', parent: 0},
{value: 'node5', parent: 1},
{value: 'node6', parent: 2},
{value: 'node7', parent: 2},
]
複製程式碼
2 孩子連結串列表示法(鏈式儲存結構)
鏈式儲存用非連續的記憶體空間來儲存樹的結點,孩子連結串列表示儲存可以很方便的找到每個結點的子結點及其兄弟結點,如下圖所示。如果帶上雙親域(即與雙親表示法結合),還可以很方便的找出其雙親結點。
記憶體中的連結串列一般對應我們程式(高階語言)中的指標或引用,那麼上面樹的孩子連結串列表示法JavaScript描述見下面程式碼。[
{
value: 'node1',
child: {
index: 1,
siblings: {
index: 2,
siblings: {
index: 3,
siblings: null
}
}
}
},
{
value: 'node2',
child: {
index: 4,
siblings: null
}
},
{
value: 'node3',
child: {
index: 5,
siblings: {
index: 6,
siblings: null
}
}
},
{value: 'node4', child: null},
{value: 'node5', child: null},
{value: 'node6', child: null},
{value: 'node7', child: null},
]
複製程式碼
3 孩子兄弟表示法(鏈式儲存結構)
孩子兄弟儲存結構每個結點有兩個指標,分別指向其左右孩子結點,比較適用於二叉樹(結點的度小於3的樹)。孩子兄弟儲存結構可以很方便的找到每個結點的子結點,如下圖所示。
孩子兄弟儲存結構JavaScript描述見下面程式碼。{
value: 'node1',
left: {
value: 'node2',
left: {
value: 'node4',
left: null,
right: null
}
right: {
value: 'node5',
left: null,
right: null
}
},
right: {
value: 'node3',
left: {
value: 'node6',
left: null,
right: null
}
}
}
複製程式碼
用計算機來解決現實社會中的問題,需要把現實世界中的實體關係模擬到計算機世界中,那麼這個時候就會產生資料結構,這是“資料結構”最終需要對映到記憶體中,所以需要進一步用計算機可以解析的程式來進行描述。
樹的遍歷
樹的遍歷是指依照一定的規律不反覆的訪問樹中的每個結點,其遍歷過程實質上是將樹這樣的非線性結構按一定規律轉化為線性結構,遍歷方式一般有先序和後續兩種(二叉樹有三種)。
先根次序遍歷:先訪問根結點,上樹遍歷結果為Rawxdhebfcstimonju後根次序遍歷:先訪問子結點,後訪問根結點,上樹遍歷結果為whdexafbsmonijtucR
本篇文章是作者參考了一些文獻之後加上個人理解對資料結構中的“樹”做出的部分總結,如果有解釋不正確的地方,希望讀者在評論區果斷提出來,我們一起共同進步。