python實(shí)現(xiàn)二叉樹的遍歷
本文實(shí)例為大家分享了python實(shí)現(xiàn)二叉樹的遍歷具體代碼,供大家參考,具體內(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)出棧
# 出棧元素不為空,則訪問
# 出棧元素有左孩子節(jié)點(diǎn)則入棧,如果有右孩子節(jié)點(diǎn)則入隊(duì)列
# 出棧元素為空,則訪問隊(duì)列
# 隊(duì)列也為空則結(jié)束循環(huán),否則隊(duì)列元素出隊(duì)
# 訪問出隊(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)出棧
# 棧頂元素不為空,則訪問, 并置已訪問標(biāo)志
# 如棧頂元素有左孩子節(jié)點(diǎn)則入棧
# 若棧頂元素已訪問,則出棧
# 出棧元素若有右孩子節(jié)點(diǎn)則入棧
# 循環(huán)直到棧無元素退出
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)沒有訪問過則入棧
# 反之,則出棧并且訪問;如果出棧元素有右孩子節(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)沒有訪問過則入棧
# 反之,如果棧頂元素如果有右孩子節(jié)點(diǎn)并且右孩子節(jié)點(diǎ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è)元素,訪問
# 如有左孩子節(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í)例
- python二叉樹遍歷的實(shí)現(xiàn)方法
- Python實(shí)現(xiàn)二叉樹結(jié)構(gòu)與進(jìn)行二叉樹遍歷的方法詳解
- Python利用前序和中序遍歷結(jié)果重建二叉樹的方法
- python實(shí)現(xiàn)的二叉樹定義與遍歷算法實(shí)例
- Python編程實(shí)現(xiàn)二叉樹及七種遍歷方法詳解
- Python數(shù)據(jù)結(jié)構(gòu)與算法之二叉樹結(jié)構(gòu)定義與遍歷方法詳解
- Python二叉樹的定義及常用遍歷算法分析
- Python二叉樹定義與遍歷方法實(shí)例分析
- Python定義二叉樹及4種遍歷方法實(shí)例詳解
- Python實(shí)現(xiàn)輸入二叉樹的先序和中序遍歷,再輸出后序遍歷操作示例
相關(guān)文章
Anaconda+pycharm安裝及環(huán)境配置全過程
在使用pyCharm進(jìn)行開發(fā)時(shí),需要用到Anaconda創(chuàng)建的環(huán)境,下面這篇文章主要給大家介紹了關(guān)于Anaconda+pycharm安裝及環(huán)境配置的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
Python first-order-model實(shí)現(xiàn)讓照片動(dòng)起來
本文將利用first-order-model實(shí)現(xiàn)讓照片動(dòng)起來,除了表情驅(qū)動(dòng)照片,還可以姿態(tài)遷移。文中的示例代碼講解詳細(xì),感興趣的可以嘗試一下2022-06-06
快速進(jìn)修Python指南之函數(shù)進(jìn)階
這篇文章主要為大家介紹了Java開發(fā)者快速進(jìn)修Python指南之函數(shù)進(jìn)階示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
詳解Python如何使用audioflux處理音頻數(shù)據(jù)
Python的audioflux庫是一個(gè)處理音頻數(shù)據(jù)的強(qiáng)大工具,旨在提供簡(jiǎn)單而強(qiáng)大的接口,用于音頻信號(hào)處理、分析和合成,下面就跟隨小編一起來學(xué)習(xí)一下它的具體使用吧2023-06-06
利用Python編寫一個(gè)簡(jiǎn)單的緩存系統(tǒng)
今天來做一個(gè)最簡(jiǎn)單的例子,利用寫一個(gè)最簡(jiǎn)單的緩存系統(tǒng),以key``value的方式保持?jǐn)?shù)據(jù),并且需要將內(nèi)容中的數(shù)據(jù)落地到文件,以便下次啟動(dòng)的時(shí)候,將文件的內(nèi)容加載進(jìn)內(nèi)存中來,感興趣的可以了解一下2023-04-04
Django Channels 實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)實(shí)時(shí)聊天和消息推送功能
這篇文章主要介紹了Django Channels 實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)實(shí)時(shí)聊天和消息推送功能,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
Python實(shí)現(xiàn)GUI計(jì)算器(附源碼)
這篇文章主要為大家詳細(xì)介紹了如何利用Python語言實(shí)現(xiàn)GUI計(jì)算器,可執(zhí)行復(fù)雜運(yùn)算,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-11-11
Python Paramiko創(chuàng)建文件目錄并上傳文件詳解
Paramiko是一個(gè)用于進(jìn)行SSH2會(huì)話的Python庫,它支持加密、認(rèn)證和文件傳輸?shù)裙δ?本文旨在詳細(xì)指導(dǎo)新手朋友如何使用Python的Paramiko庫來創(chuàng)建遠(yuǎn)程文件目錄并上傳文件,希望對(duì)大家有所幫助2024-10-10

