国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python實現(xiàn)二叉樹的遍歷

2020-02-16 11:02:47
字體:
供稿:網(wǎng)友

本文實例為大家分享了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é)點則入棧   # 重復以上循環(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é)點沒有訪問過,則入棧   # 否則,出棧并訪問   # 重復以上循環(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é)點則入隊   # 重復以上操作直到隊列入空   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()             
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 镇原县| 扎囊县| 沾益县| 贞丰县| 循化| 云阳县| 根河市| 谢通门县| 精河县| 芒康县| 益阳市| 乌兰察布市| 忻城县| 瓦房店市| 涞源县| 明星| 安泽县| 怀远县| 许昌县| 保靖县| 乐山市| 北川| 延安市| 济宁市| 望江县| 富平县| 内乡县| 修文县| 白河县| 集安市| 茂名市| 漳州市| 景泰县| 明溪县| 武清区| 嘉义县| 扶风县| 纳雍县| 星子县| 曲沃县| 邵东县|