python实现二叉树的遍历

 更新时间:2017年12月11日 10:47:51   作者:xiao2macf  
这篇文章主要为大家详细介绍了python实现二叉树的遍历,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了python实现二叉树的遍历具体代码,供大家参考,具体内容如下

代码:

# -*- 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) 
 
  # 前序遍历(非递归) 
  # 用到一个栈和一个队列 
  # 首先是根节点入栈,再循环出栈 
  # 出栈元素不为空,则访问 
  # 出栈元素有左孩子节点则入栈,如果有右孩子节点则入队列 
  # 出栈元素为空,则访问队列 
  # 队列也为空则结束循环,否则队列元素出队 
  # 访问出队元素,出队元素有左孩子节点则入栈,出队元素有右孩子节点则入队列 
  # 循环直到最后退出 
  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) 
 
  # 前序遍历(非递归) 
  # 用到一个栈 
  # 首先是根节点入栈,再循环出栈 
  # 栈顶元素不为空,则访问, 并置已访问标志 
  # 如栈顶元素有左孩子节点则入栈 
  # 若栈顶元素已访问,则出栈 
  # 出栈元素若有右孩子节点则入栈 
  # 循环直到栈无元素退出         
  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) 
 
 
  # 中序遍历(非递归) 
  # 用到一个栈 
  # 先将根节点入栈,循环出栈 
  # 如果出栈元素有左孩子节点并且左孩子节点没有访问过则入栈 
  # 反之,则出栈并且访问;如果出栈元素有右孩子节点则入栈 
  # 重复以上循环直到栈为空 
  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) 
 
 
  # 后序遍历(非递归) 
  # 用到一个栈 
  # 先将根节点入栈,循环出栈 
  # 如果出栈元素有左孩子节点并且左孩子节点没有访问过则入栈 
  # 反之,如果栈顶元素如果有右孩子节点并且右孩子节点没有访问过,则入栈 
  # 否则,出栈并访问 
  # 重复以上循环直到栈为空 
  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() 
 
 
  # 层次遍历(非递归) 
  # 用到一个队列 
  # 先将根节点入队列 
  # 从队列取出一个元素,访问 
  # 如有左孩子节点则入队,如有右孩子节点则入队 
  # 重复以上操作直到队列入空 
  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() 

结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Anaconda+pycharm安装及环境配置全过程

    Anaconda+pycharm安装及环境配置全过程

    在使用pyCharm进行开发时,需要用到Anaconda创建的环境,下面这篇文章主要给大家介绍了关于Anaconda+pycharm安装及环境配置的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • python Pillow图像降噪处理颜色处理

    python Pillow图像降噪处理颜色处理

    这篇文章主要为大家介绍了python Pillow图像降噪处理颜色处理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Python first-order-model实现让照片动起来

    Python first-order-model实现让照片动起来

    本文将利用first-order-model实现让照片动起来,除了表情驱动照片,还可以姿态迁移。文中的示例代码讲解详细,感兴趣的可以尝试一下
    2022-06-06
  • 快速进修Python指南之函数进阶

    快速进修Python指南之函数进阶

    这篇文章主要为大家介绍了Java开发者快速进修Python指南之函数进阶示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 详解Python如何使用audioflux处理音频数据

    详解Python如何使用audioflux处理音频数据

    Python的audioflux库是一个处理音频数据的强大工具,旨在提供简单而强大的接口,用于音频信号处理、分析和合成,下面就跟随小编一起来学习一下它的具体使用吧
    2023-06-06
  • 利用Python编写一个简单的缓存系统

    利用Python编写一个简单的缓存系统

    今天来做一个最简单的例子,利用写一个最简单的缓存系统,以key``value的方式保持数据,并且需要将内容中的数据落地到文件,以便下次启动的时候,将文件的内容加载进内存中来,感兴趣的可以了解一下
    2023-04-04
  • Django Channels 实现点对点实时聊天和消息推送功能

    Django Channels 实现点对点实时聊天和消息推送功能

    这篇文章主要介绍了Django Channels 实现点对点实时聊天和消息推送功能,本文分步骤给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • 使用Pyqt5制作屏幕录制界面功能

    使用Pyqt5制作屏幕录制界面功能

    这篇文章主要介绍了使用Pyqt5制作屏幕录制界面,主要介绍如何使用ffmpeg将同时录制的屏幕录像和音频合成为有声音的屏幕录像,需要的朋友可以参考下
    2022-04-04
  • Python实现GUI计算器(附源码)

    Python实现GUI计算器(附源码)

    这篇文章主要为大家详细介绍了如何利用Python语言实现GUI计算器,可执行复杂运算,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2022-11-11
  • Python Paramiko创建文件目录并上传文件详解

    Python Paramiko创建文件目录并上传文件详解

    Paramiko是一个用于进行SSH2会话的Python库,它支持加密、认证和文件传输等功能,本文旨在详细指导新手朋友如何使用Python的Paramiko库来创建远程文件目录并上传文件,希望对大家有所帮助
    2024-10-10

最新评论