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