演算法導論 p.248 10.4-4
題目描述:對於乙個含n個結點的任意有根樹,寫出乙個o(n)時間的過程,輸出其所有關鍵字,該樹以左孩子右兄弟表示法儲存。與二叉樹的遍歷類似
class
tree
:def
__init__
(self, val)
: self.val = val
self.left_child =
none
self.right_bro =
none
class
solution
:def
getallnodefromtreebystack
(self, tree=tree)
-> list[
int]:if
not self:
return
reslist, stack =
,list()
while stack:
node = stack.pop(
)if node.right_bro:
if node.left_child:
return reslist
class
solution
:def
getallnodefromtreebyqueue
(self, tree=tree)
-> list[
int]:if
not self:
return
reslist, queue =
, collections.deque(
)while queue:
node = queue.popleft(
)if node.right_bro:
if node.left_child:
return reslist
class
solution
:def
getallnodefromtreebyrecursion
(self, tree=tree)
-> list[
int]:if
not self:
return
reslist =
if tree:
if tree.right_bro:
reslist.extend(solution.getallnodefromtreebyrecursion(self=self, tree=tree.right_bro)
)if tree.left_child:
reslist.extend(solution.getallnodefromtreebyrecursion(self=self, tree=tree.left_child)
)return reslist
if __name__ ==
'__main__'
: tree = tree(0)
tree.left_child = tree(10)
tree.left_child.right_bro = tree(12)
tree.left_child.right_bro.right_bro = tree(-1
) tree.left_child.right_bro.right_bro.right_bro = tree(93)
tree.left_child.right_bro.right_bro.right_bro.left_child = tree(
100)
print
(solution.getallnodefromtreebystack(self=tree, tree=tree)
)# [0, 10, 12, -1, 93, 100]
print
(solution.getallnodefromtreebyqueue(self=tree, tree=tree)
)# [0, 10, 12, -1, 93, 100]
print
(solution.getallnodefromtreebyrecursion(self=tree, tree=tree)
)# [0, 10, 12, -1, 93, 100]
左孩子右兄弟的字典樹
一般寫的字典樹都是雙陣列的形式,但是當字元的數量很多時,就會占用大量的記憶體,初始化操作也會變慢。這時,就可以用左孩子右兄弟的寫法,來以時間換空間。下面是自己寫的乙個 1 include 2 include 3 include 4 5using namespace std 67 const int ...
樹的雙親表示法,孩子表示法以及孩子兄弟表示法
目錄如下圖所示,這是一棵普通的樹,該如何儲存呢?通常,儲存具有普通樹結構資料的方法有 3 種 雙親表示法 孩子表示法 孩子兄弟表示法 圖1雙親表示法採用順序表 也就是陣列 儲存普通樹,其實現的核心思想是 順序儲存各個節點的同時,給各節點附加乙個記錄其父節點位置的變數。注意,根節點沒有父節點 父節點又...
樹 孩子兄弟表示法的實現
樹狀圖是一種資料結構,它是由n n 1 個有限節點組成乙個具有層次關係的集合。把它叫做 樹 是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。它具有以下的特點 每個節點有零個或多個子節點 沒有父節點的節點稱為根節點 每乙個非根節點有且只有乙個父節點 除了根節點外,每個子節點可以分為多個不...