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 Property属性的2种用法
Jun 21 Python
python中Switch/Case实现的示例代码
Nov 09 Python
Python实现从log日志中提取ip的方法【正则提取】
Mar 31 Python
Django学习教程之静态文件的调用详解
May 08 Python
使用Python的Django和layim实现即时通讯的方法
May 25 Python
python 对dataframe下面的值进行大规模赋值方法
Jun 09 Python
浅析Python 引号、注释、字符串
Jul 25 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
Sep 28 Python
关于Flask项目无法使用公网IP访问的解决方式
Nov 19 Python
window环境pip切换国内源(pip安装异常缓慢的问题)
Dec 31 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
Apr 26 Python
使用pandas库对csv文件进行筛选保存
May 25 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 REMOTE_ADDR之获取访客IP的代码
2008/04/22 PHP
php实现文件下载简单示例(代码实现文件下载)
2014/03/10 PHP
用 Composer构建自己的 PHP 框架之设计 MVC
2014/10/30 PHP
PHP实现二维数组中的查找算法小结
2018/06/09 PHP
php多进程中的阻塞与非阻塞操作实例分析
2020/03/04 PHP
客户端静态页面玩分页
2006/06/26 Javascript
js 变量类型转换常用函数与代码[比较全]
2009/12/01 Javascript
让你的博文自动带上缩址的实现代码,方便发到微博客上
2010/12/28 Javascript
javascript写的异步加载js文件函数(支持数组传参)
2014/06/07 Javascript
JavaScript中数组添加值和访问值常见问题
2016/02/06 Javascript
jQuery实现两个select控件的互移操作
2016/12/22 Javascript
js 数字、字符串、布尔值的转换方法(必看)
2017/04/07 Javascript
JS常用正则表达式总结【经典】
2017/05/12 Javascript
jQury Ajax使用Token验证身份实例代码
2017/09/22 Javascript
JS从非数组对象转数组的方法小结
2018/03/26 Javascript
JS装饰器函数用法总结
2018/04/21 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
2018/12/14 Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
2019/07/22 Javascript
jquery使用echarts实现有向图可视化功能示例
2019/11/25 jQuery
[03:22]DSPL第一期精彩集锦:酷炫到底!
2014/11/07 DOTA
python的即时标记项目练习笔记
2014/09/18 Python
python实现挑选出来100以内的质数
2015/03/24 Python
python使用fcntl模块实现程序加锁功能示例
2017/06/23 Python
Django框架教程之正则表达式URL误区详解
2018/01/28 Python
python 移动图片到另外一个文件夹的实例
2019/01/10 Python
python线程里哪种模块比较适合
2020/08/02 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
Eyeko美国:屡获殊荣的睫毛膏、眼线笔和眉妆
2018/07/05 全球购物
StubHub希腊:购买体育赛事、音乐会和剧院门票
2019/08/03 全球购物
电钳专业个人求职信
2014/01/04 职场文书
歌颂祖国演讲稿
2014/05/04 职场文书
关于责任的演讲稿
2014/05/20 职场文书
奖学金感谢信
2015/01/21 职场文书
长江三峡导游词
2015/01/31 职场文书
地道战观后感400字
2015/06/04 职场文书
2015年音乐教研组工作总结
2015/07/22 职场文书