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