#coding=utf-8
class Node(object):
"""節(jié)點類"""
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 = []
def add(self, elem):
"""為樹添加節(jié)點"""
node = Node(elem=elem)
if self.root.elem == -1: # 如果樹是空的愿阐,則對根節(jié)點賦值
self.root = node
self.myQueue.append(self.root)
else:
treeNode = self.myQueue[0] # 此結(jié)點的子樹還沒有齊竞穷。
if treeNode.lchild == None:
treeNode.lchild = node
self.myQueue.append(treeNode.lchild)
else:
treeNode.rchild = node
self.myQueue.append(treeNode.rchild)
self.myQueue.pop(0) # 如果該結(jié)點存在右子樹,將此結(jié)點丟棄。
def front_digui(self, root):
"""
利用遞歸實現(xiàn)樹的先序遍歷
先序遍歷:根節(jié)點->左子樹->右子樹
"""
if root == None:
return
print root.elem,
self.front_digui(root.lchild)
self.front_digui(root.rchild)
def middle_digui(self, root):
"""
利用遞歸實現(xiàn)樹的中序遍歷
中序遍歷:左子樹->根節(jié)點->右子樹
"""
if root == None:
return
self.middle_digui(root.lchild)
print root.elem,
self.middle_digui(root.rchild)
def later_digui(self, root):
"""
利用遞歸實現(xiàn)樹的后序遍歷
后序遍歷:左子樹->右子樹->根節(jié)點
"""
if root == None:
return
self.later_digui(root.lchild)
self.later_digui(root.rchild)
print root.elem,
def front_stack(self, root):
"""利用堆棧實現(xiàn)樹的先序遍歷"""
if root == None:
return
myStack = []
node = root
while node or myStack:
while node: #從根節(jié)點開始,一直找它的左子樹
print node.elem,
myStack.append(node)
node = node.lchild
node = myStack.pop() #while結(jié)束表示當前節(jié)點node為空,即前一個節(jié)點沒有左子樹了
node = node.rchild #開始查看它的右子樹
def middle_stack(self, root):
"""利用堆棧實現(xiàn)樹的中序遍歷"""
if root == None:
return
myStack = []
node = root
while node or myStack:
while node: #從根節(jié)點開始,一直找它的左子樹
myStack.append(node)
node = node.lchild
node = myStack.pop() #while結(jié)束表示當前節(jié)點node為空沟优,即前一個節(jié)點沒有左子樹了
print node.elem,
node = node.rchild #開始查看它的右子樹
def later_stack(self, root):
"""利用堆棧實現(xiàn)樹的后序遍歷"""
if root == None:
return
myStack1 = []
myStack2 = []
node = root
myStack1.append(node)
while myStack1: #這個while循環(huán)的功能是找出后序遍歷的逆序,存在myStack2里面
node = myStack1.pop()
if node.lchild:
myStack1.append(node.lchild)
if node.rchild:
myStack1.append(node.rchild)
myStack2.append(node)
while myStack2: #將myStack2中的元素出棧睬辐,即為后序遍歷次序
print myStack2.pop().elem,
def level_queue(self, root):
"""利用隊列實現(xiàn)樹的層次遍歷"""
if root == None:
return
myQueue = []
node = root
myQueue.append(node)
while myQueue:
node = myQueue.pop(0)
print node.elem,
if node.lchild != None:
myQueue.append(node.lchild)
if node.rchild != None:
myQueue.append(node.rchild)
if __name__ == '__main__':
"""主函數(shù)"""
elems = range(10) #生成十個數(shù)據(jù)作為樹節(jié)點
tree = Tree() #新建一個樹對象
for elem in elems:
tree.add(elem) #逐個添加樹的節(jié)點
print '隊列實現(xiàn)層次遍歷:'
tree.level_queue(tree.root)
print '\n\n遞歸實現(xiàn)先序遍歷:'
tree.front_digui(tree.root)
print '\n遞歸實現(xiàn)中序遍歷:'
tree.middle_digui(tree.root)
print '\n遞歸實現(xiàn)后序遍歷:'
tree.later_digui(tree.root)
print '\n\n堆棧實現(xiàn)先序遍歷:'
tree.front_stack(tree.root)
print '\n堆棧實現(xiàn)中序遍歷:'
tree.middle_stack(tree.root)
print '\n堆棧實現(xiàn)后序遍歷:'
tree.later_stack(tree.root)
兩種方式實現(xiàn)二叉樹遍歷(包含先序,中序,后序) 基于 Python2.x
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門洪橘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人棵帽,你說我怎么就攤上這事熄求。” “怎么了逗概?”我有些...
- 文/不壞的土叔 我叫張陵弟晚,是天一觀的道長。 經(jīng)常有香客問我逾苫,道長卿城,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任铅搓,我火速辦了婚禮瑟押,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘星掰。我一直安慰自己多望,他們只是感情好,可當我...
- 文/花漫 我一把揭開白布氢烘。 她就那樣靜靜地躺著怀偷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪播玖。 梳的紋絲不亂的頭發(fā)上椎工,一...
- 文/蒼蘭香墨 我猛地睜開眼随静,長吁一口氣:“原來是場噩夢啊……” “哼八千!你這毒婦竟也來了吗讶?” 一聲冷哼從身側(cè)響起,我...
- 正文 年R本政府宣布败玉,位于F島的核電站,受9級特大地震影響镜硕,放射性物質(zhì)發(fā)生泄漏运翼。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一兴枯、第九天 我趴在偏房一處隱蔽的房頂上張望血淌。 院中可真熱鬧,春花似錦财剖、人聲如沸六剥。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽疗疟。三九已至,卻和暖如春瞳氓,著一層夾襖步出監(jiān)牢的瞬間策彤,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 本文實例講述了PHP基于非遞歸算法實現(xiàn)先序、中序及后序遍歷二叉樹操作瞬场。分享給大家供大家參考买鸽,具體如下 概述: 二叉...
- 先序遍歷:根、左贯被、右 中序遍歷:左眼五、根、右 后序遍歷:左彤灶、右看幼、根 下面是我覺得網(wǎng)上講解的不錯的理解方式
- 提示:由于本人沒有精力做那么多流程圖苞轿,建議你看的時候自己在紙上畫一畫,模擬一下順序逗物,不然很難理解搬卒。 1.先序遍歷 ...
- 同時發(fā)布:https://notes.daiyuhe.com/traversal-of-binary-tree/ ...