資料結構 樹

2021-08-28 04:09:18 字數 3656 閱讀 5573

樹結構是一種包括節點(nodes)和邊(edges)的擁有層級關係的一種結構

圖中根節點為t;

t到k的路徑tcrk;

xc的父節點是t,bg的父節點是x,km的父節點是r;

t的子節點是xc,c的子節點是jr, r的子節點km;

兄弟節點如b和g、j和r、k和m、

葉節點:bzjkm

每個父節點最多只有兩個子節點的樹,上圖的樹就是二叉樹。

與二叉樹相關的概念:

節點深度(depth),樹的高度(height),樹的寬度(width),樹的 size

在構建二叉樹的時候,再次說明一下二叉樹的根,節點,葉,分支等概念。

一棵樹可以看成乙個根節點和一系列的分支組成的結構。每乙個分支又是一棵樹,稱之為子樹。沒有分支的樹稱為葉。

在構建乙個樹時,我們需要構建兩部分,第一部分是根節點,第二部分是分支。在構造分支時,我們要保證每乙個分支都是樹的結構。所以要定義乙個建構函式tree(),乙個分支函式branches(),乙個判斷分支是否是樹的函式is_tree(). 除此之外,我們還可以定義乙個label()函式用於獲取根節點的值,乙個is_leaf()判斷乙個分支是不是葉節點。

定義乙個樹的建構函式:

>>

>

deftree

(root_label, branches=

):for branch in branches:

assert is_tree(branch)

,'branches must be trees'

# 保證每乙個分支都是乙個子樹

return

[root_label]

+list

(branches)

定義乙個函式獲取根節點的值:

>>

>

deflabel

(tree)

:return tree[

0]

定義乙個函式獲取所有的分支:

>>

>

defbranches

(tree)

:return tree[1:

]

定義乙個is_tree()函式判斷分支是否為樹:

滿足兩個條件就是樹:

>>

>

defis_tree

(tree):if

type

(tree)

!=list

orlen

(tree)

<1:

return

false

for branch in branches(tree):if

not is_tree(branch)

:return

false

return

true

下面這個函式用於判斷這棵樹是否還有分支,也就判斷他是否是葉節點:

>>

>

defis_leaf

(tree)

:return

not branches(tree)

乙個完整的示例:

def

tree

(root_label, branches=

):for branch in branches:

assert is_tree(branch)

,'branches must be trees'

return

[root_label]

+list

(branches)

deflabel

(tree)

:return tree[0]

defbranches

(tree)

:return tree[1:

]def

is_tree

(tree):if

type

(tree)

!=list

orlen

(tree)

<1:

return

false

for branch in branches(tree):if

not is_tree(branch)

:return

false

return

true

defis_leaf

(tree)

:return

not branches(tree)

t = tree(3,

[tree(1)

, tree(2,

[tree(1)

, tree(1)

])])

label(t)

branches(t)

label(branches(t)[1

])is_leaf(t)

is_leaf(branches(t)[0

])

結果:

>>

> t = tree(3,

[tree(1)

, tree(2,

[tree(1)

, tree(1)

])])

>>

> t[3

,[1]

,[2,

[1],

[1]]

]>>

> label(t)

3>>

> branches(t)[[

1],[

2,[1

],[1

]]]>>

> label(branches(t)[1

])2>>

> is_leaf(t)

false

>>

> is_leaf(branches(t)[0

])true

二叉樹是一種遞迴結構,因為單獨拿出來乙個 subtree 子樹出來,其實它還是一棵樹。那可以直接用遞迴的方式來遍歷它。但是當處理順序不同的時候,樹又分為三種遍歷方式:

資料結構 樹

樹的概念 1.家族樹 在現實生活中,有入如下血統關係的家族可用樹形圖表示 張源有三個孩子張明 張亮和張麗 張明有兩個孩子張林和張維 張亮有三個孩子張平 張華和張群 張平有兩個孩子張晶和張磊。以上表示很像一棵倒畫的樹。其中 樹根 是張源,樹的 分支點 是張明 張亮和張平,該家族的其餘成員均是 樹葉 而...

資料結構 樹

1 定義 樹是一種非線性結構,是一種一對多的資料結構。分析樹的結構,我們用遞迴的方法,根結點下面又可以看做是子樹。2 樹的儲存結構 我們一般用孩子兄弟法儲存。也就是把乙個結點的左邊第乙個孩子放在此結點的左邊孩子,把此結點的右兄弟放在此結點的右邊孩子。這樣就產生了二叉樹。二叉樹和樹可以相互對應。3 二...

資料結構 樹

二叉樹性質回顧 滿二叉樹 完全二叉樹等 給定一棵二叉樹,要求分層遍歷該二叉樹,即從上到下按層次訪問該樹,每一層單獨輸出一行,每一層要求訪問的順序為從左到右。我們在遍歷的過程中將該層節點的孩子節點壓入乙個佇列,這樣就可以實現從上到下一層一層地遍歷該二叉樹。層序遍歷 並分層列印 如果不用分層的話只用佇列...