python實(shí)現(xiàn)二叉樹(shù)的遍歷
本文實(shí)例為大家分享了python實(shí)現(xiàn)二叉樹(shù)的遍歷具體代碼,供大家參考,具體內(nèi)容如下

代碼:
# -*- coding: gb2312 -*-
class Queue(object):
def __init__(self):
self.q = []
def enqueue(self, item):
self.q.append(item)
def dequeue(self):
# if self.q != []:
if len(self.q)>0:
return self.q.pop(0)
else:
return None
def length(self):
return len(self.q)
def isempty(self):
return len(self.q)==0
class Stack(object):
def __init__(self):
self.s = []
def push(self, item):
self.s.append(item)
def pop(self):
if self.s !=[]:
item = self.s.pop(-1)
else:
item = None
return item
def length(self):
return len(self.s)
def isempty(self):
return self.s == []
def top(self):
return self.s[-1]
class TreeNode(object):
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
self.visited = False
def setData(self, data):
self.data = data
def setLeft(self, left):
self.left = left
def setRight(self, right):
self.right = right
def visit(self):
print self.data,
self.visited = True
def deVisit(self):
self.visited = False
class BinaryTree(object):
def __init__(self, root):
self.root = root
# 前序遍歷(遞歸)
def freshVisit(self, node):
if node is not None:
node.deVisit()
if node.left:
self.freshVisit(node.left)
if node.right:
self.freshVisit(node.right)
# 前序遍歷(遞歸)
def preOrder(self, node):
if node is not None:
node.visit()
if node.left:
self.preOrder(node.left)
if node.right:
self.preOrder(node.right)
# 中序遍歷(遞歸)
def inOrder(self, node):
if node.left:
self.inOrder(node.left)
if node is not None:
node.visit()
if node.right:
self.inOrder(node.right)
# 后序遍歷(遞歸)
def postOrder(self, node):
if node.left:
self.postOrder(node.left)
if node.right:
self.postOrder(node.right)
if node is not None:
node.visit()
# 遞歸遍歷
def orderTraveral(self, type):
if type == 0:
self.preOrder(self.root)
elif type == 1:
self.inOrder(self.root)
elif type == 2:
self.postOrder(self.root)
# 前序遍歷(非遞歸)
# 用到一個(gè)棧和一個(gè)隊(duì)列
# 首先是根節(jié)點(diǎn)入棧,再循環(huán)出棧
# 出棧元素不為空,則訪問(wèn)
# 出棧元素有左孩子節(jié)點(diǎn)則入棧,如果有右孩子節(jié)點(diǎn)則入隊(duì)列
# 出棧元素為空,則訪問(wèn)隊(duì)列
# 隊(duì)列也為空則結(jié)束循環(huán),否則隊(duì)列元素出隊(duì)
# 訪問(wèn)出隊(duì)元素,出隊(duì)元素有左孩子節(jié)點(diǎn)則入棧,出隊(duì)元素有右孩子節(jié)點(diǎn)則入隊(duì)列
# 循環(huán)直到最后退出
def preOrderByNotRecursion(self):
s = Stack()
q = Queue()
q.enqueue(self.root)
while not s.isempty() or not q.isempty():
if not q.isempty():
item = q.dequeue()
item.visit()
if item.left:
q.enqueue(item.left)
if item.right:
s.push(item.right)
elif not s.isempty():
item = s.pop()
item.visit()
if item.left:
q.enqueue(item.left)
if item.right:
s.push(item.right)
# 前序遍歷(非遞歸)
# 用到一個(gè)棧
# 首先是根節(jié)點(diǎn)入棧,再循環(huán)出棧
# 棧頂元素不為空,則訪問(wèn), 并置已訪問(wèn)標(biāo)志
# 如棧頂元素有左孩子節(jié)點(diǎn)則入棧
# 若棧頂元素已訪問(wèn),則出棧
# 出棧元素若有右孩子節(jié)點(diǎn)則入棧
# 循環(huán)直到棧無(wú)元素退出
def preOrderByNotRecursion2(self):
s = Stack()
s.push(self.root)
while not s.isempty():
item = s.top()
if item.visited:
s.pop()
if item.right:
s.push(item.right)
else:
item.visit()
if item.left:
s.push(item.left)
# 中序遍歷(非遞歸)
# 用到一個(gè)棧
# 先將根節(jié)點(diǎn)入棧,循環(huán)出棧
# 如果出棧元素有左孩子節(jié)點(diǎn)并且左孩子節(jié)點(diǎn)沒(méi)有訪問(wèn)過(guò)則入棧
# 反之,則出棧并且訪問(wèn);如果出棧元素有右孩子節(jié)點(diǎn)則入棧
# 重復(fù)以上循環(huán)直到棧為空
def inOrderByNotRecursion(self):
s = Stack()
s.push(self.root)
while not s.isempty():
item = s.top()
while(item.left and not item.left.visited):
s.push(item.left)
item = item.left
else:
item = s.pop()
item.visit()
if item.right:
s.push(item.right)
# 后序遍歷(非遞歸)
# 用到一個(gè)棧
# 先將根節(jié)點(diǎn)入棧,循環(huán)出棧
# 如果出棧元素有左孩子節(jié)點(diǎn)并且左孩子節(jié)點(diǎn)沒(méi)有訪問(wèn)過(guò)則入棧
# 反之,如果棧頂元素如果有右孩子節(jié)點(diǎn)并且右孩子節(jié)點(diǎn)沒(méi)有訪問(wèn)過(guò),則入棧
# 否則,出棧并訪問(wèn)
# 重復(fù)以上循環(huán)直到棧為空
def postOrderByNotRecursion(self):
s = Stack()
s.push(self.root)
while not s.isempty():
item = s.top()
while(item.left and not item.left.visited):
s.push(item.left)
item = item.left
else:
if item.right and not item.right.visited:
s.push(item.right)
else:
item = s.pop()
item.visit()
# 層次遍歷(非遞歸)
# 用到一個(gè)隊(duì)列
# 先將根節(jié)點(diǎn)入隊(duì)列
# 從隊(duì)列取出一個(gè)元素,訪問(wèn)
# 如有左孩子節(jié)點(diǎn)則入隊(duì),如有右孩子節(jié)點(diǎn)則入隊(duì)
# 重復(fù)以上操作直到隊(duì)列入空
def layerOrder(self):
q = Queue()
q.enqueue(self.root)
while not q.isempty():
item = q.dequeue()
item.visit()
if item.left:
q.enqueue(item.left)
if item.right:
q.enqueue(item.right)
# A
# B C
# D E F G
#H
if __name__ == '__main__':
nE = TreeNode('E');
nF = TreeNode('F');
nG = TreeNode('G');
nH = TreeNode('H');
nD = TreeNode('D', nH);
nB = TreeNode('B', nD, nE);
nC = TreeNode('C', nF, nG);
nA = TreeNode('A', nB, nC);
bTree = BinaryTree(nA);
# 前序遞歸遍歷
print '----------前序遍歷(遞歸)-----------'
bTree.orderTraveral(0)
print '\n----------中序遍歷(遞歸)-----------'
bTree.orderTraveral(1)
print '\n----------后序遍歷(遞歸)-----------'
bTree.orderTraveral(2)
print '\n\n----------前序遍歷(非遞歸)-----------'
print '----------方法一-----------'
bTree.freshVisit(bTree.root)
bTree.preOrderByNotRecursion()
print '\n----------方法二-----------'
bTree.freshVisit(bTree.root)
bTree.preOrderByNotRecursion2()
print '\n\n----------中序遍歷(非遞歸)-----------'
bTree.freshVisit(bTree.root)
bTree.inOrderByNotRecursion()
print '\n\n----------后序遍歷(非遞歸)-----------'
bTree.freshVisit(bTree.root)
bTree.postOrderByNotRecursion()
print '\n\n----------層次遍歷(非遞歸)-----------'
bTree.freshVisit(bTree.root)
bTree.layerOrder()
結(jié)果:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)的遍歷實(shí)例
- python二叉樹(shù)遍歷的實(shí)現(xiàn)方法
- Python實(shí)現(xiàn)二叉樹(shù)結(jié)構(gòu)與進(jìn)行二叉樹(shù)遍歷的方法詳解
- Python利用前序和中序遍歷結(jié)果重建二叉樹(shù)的方法
- python實(shí)現(xiàn)的二叉樹(shù)定義與遍歷算法實(shí)例
- Python編程實(shí)現(xiàn)二叉樹(shù)及七種遍歷方法詳解
- Python數(shù)據(jù)結(jié)構(gòu)與算法之二叉樹(shù)結(jié)構(gòu)定義與遍歷方法詳解
- Python二叉樹(shù)的定義及常用遍歷算法分析
- Python二叉樹(shù)定義與遍歷方法實(shí)例分析
- Python定義二叉樹(shù)及4種遍歷方法實(shí)例詳解
- Python實(shí)現(xiàn)輸入二叉樹(shù)的先序和中序遍歷,再輸出后序遍歷操作示例
相關(guān)文章
python三元運(yùn)算符實(shí)現(xiàn)方法
這篇文章主要介紹了python實(shí)現(xiàn)三元運(yùn)算符的方法,大家參考使用吧2013-12-12
python批量從es取數(shù)據(jù)的方法(文檔數(shù)超過(guò)10000)
今天小編就為大家分享一篇python批量從es取數(shù)據(jù)的方法(文檔數(shù)超過(guò)10000),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
Python讀取JSON數(shù)據(jù)操作實(shí)例解析
這篇文章主要介紹了Python讀取JSON數(shù)據(jù)操作實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
tensorflow實(shí)現(xiàn)測(cè)試時(shí)讀取任意指定的check point的網(wǎng)絡(luò)參數(shù)
今天小編就為大家分享一篇tensorflow實(shí)現(xiàn)測(cè)試時(shí)讀取任意指定的check point的網(wǎng)絡(luò)參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
python實(shí)現(xiàn)通過(guò)pil模塊對(duì)圖片格式進(jìn)行轉(zhuǎn)換的方法
這篇文章主要介紹了python實(shí)現(xiàn)通過(guò)pil模塊對(duì)圖片格式進(jìn)行轉(zhuǎn)換的方法,涉及Python中pil模塊的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
python cv2截取不規(guī)則區(qū)域圖片實(shí)例
今天小編就為大家分享一篇python cv2截取不規(guī)則區(qū)域圖片實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
Python的3種運(yùn)行方式:命令行窗口、Python解釋器、IDLE的實(shí)現(xiàn)
這篇文章主要介紹了Python的3種運(yùn)行方式:命令行窗口、Python解釋器、IDLE的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Pytorch中torch.argmax()函數(shù)使用及說(shuō)明
這篇文章主要介紹了Pytorch中torch.argmax()函數(shù)使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01

