python实现二叉树的遍历


Posted in Python onDecember 11, 2017

本文实例为大家分享了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()

结果:

python实现二叉树的遍历

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

Python 相关文章推荐
Python中使用Inotify监控文件实例
Feb 14 Python
python实现批量改文件名称的方法
May 25 Python
Python基于二分查找实现求整数平方根的方法
May 12 Python
Python使用functools模块中的partial函数生成偏函数
Jul 02 Python
python实现给微信公众号发送消息的方法
Jun 30 Python
Python基于回溯法子集树模板解决找零问题示例
Sep 11 Python
Python3实现腾讯云OCR识别
Nov 27 Python
在Python运行时动态查看进程内部信息的方法
Feb 22 Python
从0开始的Python学习016异常
Apr 08 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
Feb 27 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
Jun 16 Python
python selenium 获取接口数据的实现
Dec 07 Python
django上传图片并生成缩略图方法示例
Dec 11 #Python
使用Python的package机制如何简化utils包设计详解
Dec 11 #Python
python timestamp和datetime之间转换详解
Dec 11 #Python
Python时间戳使用和相互转换详解
Dec 11 #Python
python的exec、eval使用分析
Dec 11 #Python
Python中eval带来的潜在风险代码分析
Dec 11 #Python
Python验证文件是否可读写代码分享
Dec 11 #Python
You might like
如何对PHP程序中的常见漏洞进行攻击
2006/10/09 PHP
PHP中的正则表达式函数介绍
2012/02/27 PHP
PHP递归返回值时出现的问题解决办法
2013/02/19 PHP
解析:使用php mongodb扩展时 需要注意的事项
2013/06/18 PHP
微信扫描二维码登录网站代码示例
2013/12/30 PHP
PHP实现接收二进制流转换成图片的方法
2017/01/10 PHP
jquery 分页控件实现代码
2009/11/30 Javascript
node.js中的fs.utimes方法使用说明
2014/12/15 Javascript
JavaScript事件类型中焦点、鼠标和滚轮事件详解
2016/01/25 Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
原生JS实现循环Nodelist Dom列表的4种方式示例
2018/02/11 Javascript
vue动画之点击按钮往上渐渐显示出来的实例
2018/09/29 Javascript
Vuex中的State使用介绍
2019/01/19 Javascript
JS实现在线ps功能详解
2019/07/31 Javascript
vue prop传值类型检验方式
2020/07/30 Javascript
[50:01]Ti4 冒泡赛第二天 NEWBEE vs Titan
2014/07/15 DOTA
浅谈Python的Django框架中的缓存控制
2015/07/24 Python
python爬虫入门教程--利用requests构建知乎API(三)
2017/05/25 Python
解决python 输出是省略号的问题
2018/04/19 Python
Python之list对应元素求和的方法
2018/06/28 Python
python批量获取html内body内容的实例
2019/01/02 Python
python 字段拆分详解
2019/12/17 Python
手动安装python3.6的操作过程详解
2020/01/13 Python
Jupyter notebook命令和编辑模式常用快捷键汇总
2020/11/17 Python
详解如何获取localStorage最大存储大小的方法
2020/05/21 HTML / CSS
当x.equals(y)等于true时,x.hashCode()与y.hashCode()可以不相等,这句话对不对
2015/05/02 面试题
初中三好学生事迹材料
2014/01/13 职场文书
客服专员岗位职责
2014/02/28 职场文书
希特勒经典演讲稿
2014/05/19 职场文书
离婚协议书应该怎么写
2014/10/12 职场文书
党的群众路线教育实践活动制度建设计划方案
2014/10/31 职场文书
自愿离婚协议书2015
2015/01/26 职场文书
我的中国梦心得体会范文
2016/01/05 职场文书
CSS3鼠标悬浮过渡缩放效果
2021/04/17 HTML / CSS
python利用while求100内的整数和方式
2021/11/07 Python