class
node
(object):
"""節點類"""
def__init__
(self, elem=-1
, lchild=
none
, rchild=
none):
self.elem = elem
self.lchild = lchild
self.rchild = rchild
class
tree
(object):
"""樹類"""
def__init__
(self)
: self.root = node(
) self.myqueue =
defadd
(self, elem)
:"""為樹新增節點"""
node = node(elem)
if self.root.elem ==-1
:# 如果樹是空的,則對根節點賦值
self.root = node
else
: treenode = self.myqueue[0]
# 此結點的子樹還沒有齊。
if treenode.lchild ==
none
: treenode.lchild = node
else
: treenode.rchild = node
self.myqueue.pop(0)
# 如果該結點存在右子樹,將此結點丟棄。
deffront_digui
(self, root)
:"""利用遞迴實現樹的先序遍歷"""
if root ==
none
:return
print root.elem,
self.front_digui(root.lchild)
self.front_digui(root.rchild)
defmiddle_digui
(self, root)
:"""利用遞迴實現樹的中序遍歷"""
if root ==
none
:return
self.middle_digui(root.lchild)
print root.elem,
self.middle_digui(root.rchild)
deflater_digui
(self, root)
:"""利用遞迴實現樹的後序遍歷"""
if root ==
none
:return
self.later_digui(root.lchild)
self.later_digui(root.rchild)
print root.elem,
deffront_stack
(self, root)
:"""利用堆疊實現樹的先序遍歷"""
if root ==
none
:return
mystack =
node = root
while node or mystack:
while node:
#從根節點開始,一直找它的左子樹
print node.elem,
node = node.lchild
node = mystack.pop(
)#while結束表示當前節點node為空,即前乙個節點沒有左子樹了
node = node.rchild #開始檢視它的右子樹
defmiddle_stack
(self, root)
:"""利用堆疊實現樹的中序遍歷"""
if root ==
none
:return
mystack =
node = root
while node or mystack:
while node:
#從根節點開始,一直找它的左子樹
node = node.lchild
node = mystack.pop(
)#while結束表示當前節點node為空,即前乙個節點沒有左子樹了
print node.elem,
node = node.rchild #開始檢視它的右子樹
deflater_stack
(self, root)
:"""利用堆疊實現樹的後序遍歷"""
if root ==
none
:return
mystack1 =
mystack2 =
node = root
while mystack1:
#這個while迴圈的功能是找出後序遍歷的逆序,存在mystack2裡面
node = mystack1.pop(
)if node.lchild:
if node.rchild:
while mystack2:
#將mystack2中的元素出棧,即為後序遍歷次序
print mystack2.pop(
).elem,
deflevel_queue
(self, root)
:"""利用佇列實現樹的層次遍歷"""
if root ==
none
:return
myqueue =
node = root
while myqueue:
node = myqueue.pop(0)
print node.elem,
if node.lchild !=
none
:if node.rchild !=
none
:if __name__ ==
'__main__'
:"""主函式"""
elems =
range(10
)#生成十個資料作為樹節點
tree = tree(
)#新建乙個樹物件
for elem in elems:
tree.add(elem)
#逐個新增樹的節點
print
'佇列實現層次遍歷:'
tree.level_queue(tree.root)
print
'\n\n遞迴實現先序遍歷:'
tree.front_digui(tree.root)
print
'\n遞迴實現中序遍歷:'
tree.middle_digui(tree.root)
print
'\n遞迴實現後序遍歷:'
tree.later_digui(tree.root)
print
'\n\n堆疊實現先序遍歷:'
tree.front_stack(tree.root)
print
'\n堆疊實現中序遍歷:'
tree.middle_stack(tree.root)
print
'\n堆疊實現後序遍歷:'
tree.later_stack(tree.root)
深度優先遍歷 和 廣度優先遍歷
圖的廣度優先搜尋是樹的按層次遍歷的推廣,它的基本思想是 首先訪問初始點vi,並將其標記為已訪問過,接著訪問vi的所有未被訪問過的鄰接點 vi1,vi2,vi t,並均標記已訪問過,然後再按照vi1,vi2,vi t的次序,訪問每乙個頂點的所有未被訪問過的鄰接點,並均標記為已訪問過,依次類推,直到圖中...
廣度優先遍歷和深度優先遍歷
深度優先遍歷 廣度優先遍歷是圖的一種遍歷方式,它的思想就是遍歷這個點相鄰的所有的點,再對這些點進行廣度優先遍歷.如下圖所示 首先我們從a點開始遍歷,然後遍歷所有和a相鄰的點f和點g 然後對f和點g進行遍歷進行遍歷,得到點e,h,k和b 然後再繼續,知道所有的點都遍歷完成 首先,我們先定義圖graph...
廣度優先遍歷和深度優先遍歷
1.1 概念 以初始節點v0作為第一層節點,接著訪問它。然後迭代第一層節點即v0,訪問它相鄰接的沒有訪問過的節點比如v1,v2,v1,v2加入到第二層節點 迭代第二層節點v1,v2,v1,v2依次訪問相鄰接的沒有訪問過的節點,重複上述步驟直至所有節點都被訪問過為止。如圖所示首先訪問根節點v0,並將v...