python實現(xiàn)二叉樹的遍歷
更新時間:2017年12月11日 10:47:51 作者:xiao2macf
這篇文章主要為大家詳細介紹了python實現(xiàn)二叉樹的遍歷,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了python實現(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)
# 前序遍歷(非遞歸)
# 用到一個棧和一個隊列
# 首先是根節(jié)點入棧,再循環(huán)出棧
# 出棧元素不為空,則訪問
# 出棧元素有左孩子節(jié)點則入棧,如果有右孩子節(jié)點則入隊列
# 出棧元素為空,則訪問隊列
# 隊列也為空則結(jié)束循環(huán),否則隊列元素出隊
# 訪問出隊元素,出隊元素有左孩子節(jié)點則入棧,出隊元素有右孩子節(jié)點則入隊列
# 循環(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)
# 前序遍歷(非遞歸)
# 用到一個棧
# 首先是根節(jié)點入棧,再循環(huán)出棧
# 棧頂元素不為空,則訪問, 并置已訪問標志
# 如棧頂元素有左孩子節(jié)點則入棧
# 若棧頂元素已訪問,則出棧
# 出棧元素若有右孩子節(jié)點則入棧
# 循環(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)
# 中序遍歷(非遞歸)
# 用到一個棧
# 先將根節(jié)點入棧,循環(huán)出棧
# 如果出棧元素有左孩子節(jié)點并且左孩子節(jié)點沒有訪問過則入棧
# 反之,則出棧并且訪問;如果出棧元素有右孩子節(jié)點則入棧
# 重復(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)
# 后序遍歷(非遞歸)
# 用到一個棧
# 先將根節(jié)點入棧,循環(huán)出棧
# 如果出棧元素有左孩子節(jié)點并且左孩子節(jié)點沒有訪問過則入棧
# 反之,如果棧頂元素如果有右孩子節(jié)點并且右孩子節(jié)點沒有訪問過,則入棧
# 否則,出棧并訪問
# 重復(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()
# 層次遍歷(非遞歸)
# 用到一個隊列
# 先將根節(jié)點入隊列
# 從隊列取出一個元素,訪問
# 如有左孩子節(jié)點則入隊,如有右孩子節(jié)點則入隊
# 重復(fù)以上操作直到隊列入空
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é)果:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- python數(shù)據(jù)結(jié)構(gòu)之二叉樹的遍歷實例
- python二叉樹遍歷的實現(xiàn)方法
- Python實現(xiàn)二叉樹結(jié)構(gòu)與進行二叉樹遍歷的方法詳解
- Python利用前序和中序遍歷結(jié)果重建二叉樹的方法
- python實現(xiàn)的二叉樹定義與遍歷算法實例
- Python編程實現(xiàn)二叉樹及七種遍歷方法詳解
- Python數(shù)據(jù)結(jié)構(gòu)與算法之二叉樹結(jié)構(gòu)定義與遍歷方法詳解
- Python二叉樹的定義及常用遍歷算法分析
- Python二叉樹定義與遍歷方法實例分析
- Python定義二叉樹及4種遍歷方法實例詳解
- Python實現(xiàn)輸入二叉樹的先序和中序遍歷,再輸出后序遍歷操作示例
相關(guān)文章
Anaconda+pycharm安裝及環(huán)境配置全過程
在使用pyCharm進行開發(fā)時,需要用到Anaconda創(chuàng)建的環(huán)境,下面這篇文章主要給大家介紹了關(guān)于Anaconda+pycharm安裝及環(huán)境配置的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-09-09
Python first-order-model實現(xiàn)讓照片動起來
本文將利用first-order-model實現(xiàn)讓照片動起來,除了表情驅(qū)動照片,還可以姿態(tài)遷移。文中的示例代碼講解詳細,感興趣的可以嘗試一下2022-06-06
詳解Python如何使用audioflux處理音頻數(shù)據(jù)
Python的audioflux庫是一個處理音頻數(shù)據(jù)的強大工具,旨在提供簡單而強大的接口,用于音頻信號處理、分析和合成,下面就跟隨小編一起來學(xué)習(xí)一下它的具體使用吧2023-06-06
Django Channels 實現(xiàn)點對點實時聊天和消息推送功能
這篇文章主要介紹了Django Channels 實現(xiàn)點對點實時聊天和消息推送功能,本文分步驟給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07
Python Paramiko創(chuàng)建文件目錄并上傳文件詳解
Paramiko是一個用于進行SSH2會話的Python庫,它支持加密、認證和文件傳輸?shù)裙δ?本文旨在詳細指導(dǎo)新手朋友如何使用Python的Paramiko庫來創(chuàng)建遠程文件目錄并上傳文件,希望對大家有所幫助2024-10-10

