Python深度優先遍歷和廣度優先遍歷實現

2021-09-29 19:20:26 字數 3720 閱讀 6942

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...