Python实现二叉树前序、中序、后序及层次遍历示例代码


Posted in Python onMay 18, 2019

前言

树是数据结构中非常重要的一种,主要的用途是用来提高查找效率,对于要重复查找的情况效果更佳,如二叉排序树、FP-树。另外可以用来提高编码效率,如哈弗曼树。

用 Python 实现树的构造和几种遍历算法。实现功能如下:

  • 树的构造
  • 递归实现先序遍历、中序遍历、后序遍历
  • 堆栈实现先序遍历、中序遍历、后序遍历
  • 队列实现层次遍历
# -*- coding=utf-8 -*-


class Node(object):
 """节点类"""

 def __init__(self, element=-1, l_child=None, r_child=None):
  self.element = element
  self.l_child = l_child
  self.r_child = r_child


class Tree(object):
 """树类"""

 def __init__(self):
  self.root = Node()
  self.queue = []

 def add_node(self, element):
  """为树添加节点"""

  node = Node(element)
  # 如果树是空的,则对根节点赋值
  if self.root.element == -1:
   self.root = node
   self.queue.append(self.root)
  else:
   tree_node = self.queue[0]
   # 此结点没有左子树,则创建左子树节点
   if tree_node.l_child is None:
    tree_node.l_child = node
    self.queue.append(tree_node.l_child)
   else:
    tree_node.r_child = node
    self.queue.append(tree_node.r_child)
    # 如果该结点存在右子树,将此节点丢弃
    self.queue.pop(0)

 def front_recursion(self, root):
  """利用递归实现树的前序遍历"""

  if root is None:
   return

  print root.element,
  self.front_recursion(root.l_child)
  self.front_recursion(root.r_child)

 def middle_recursion(self, root):
  """利用递归实现树的中序遍历"""

  if root is None:
   return

  self.middle_recursion(root.l_child)
  print root.element,
  self.middle_recursion(root.r_child)

 def back_recursion(self, root):
  """利用递归实现树的后序遍历"""

  if root is None:
   return

  self.back_recursion(root.l_child)
  self.back_recursion(root.r_child)
  print root.element,

 @staticmethod
 def front_stack(root):
  """利用堆栈实现树的前序遍历"""

  if root is None:
   return

  stack = []
  node = root
  while node or stack:
   # 从根节点开始,一直找它的左子树
   while node:
    print node.element,
    stack.append(node)
    node = node.l_child
   # while结束表示当前节点node为空,即前一个节点没有左子树了
   node = stack.pop()
   # 开始查看它的右子树
   node = node.r_child

 @staticmethod
 def middle_stack(root):
  """利用堆栈实现树的中序遍历"""

  if root is None:
   return

  stack = []
  node = root
  while node or stack:
   # 从根节点开始,一直找它的左子树
   while node:
    stack.append(node)
    node = node.l_child
   # while结束表示当前节点node为空,即前一个节点没有左子树了
   node = stack.pop()
   print node.element,
   # 开始查看它的右子树
   node = node.r_child

 @staticmethod
 def back_stack(root):
  """利用堆栈实现树的后序遍历"""

  if root is None:
   return

  stack1 = []
  stack2 = []
  node = root
  stack1.append(node)
  # 这个while循环的功能是找出后序遍历的逆序,存在stack2里面
  while stack1:
   node = stack1.pop()
   if node.l_child:
    stack1.append(node.l_child)
   if node.r_child:
    stack1.append(node.r_child)
   stack2.append(node)
  # 将stack2中的元素出栈,即为后序遍历次序
  while stack2:
   print stack2.pop().element,

 @staticmethod
 def level_queue(root):
  """利用队列实现树的层次遍历"""

  if root is None:
   return

  queue = []
  node = root
  queue.append(node)
  while queue:
   node = queue.pop(0)
   print node.element,
   if node.l_child is not None:
    queue.append(node.l_child)
   if node.r_child is not None:
    queue.append(node.r_child)


if __name__ == '__main__':
 """主函数"""

 # 生成十个数据作为树节点
 elements = range(10)
 tree = Tree()
 for elem in elements:
  tree.add_node(elem)

 print '队列实现层次遍历:'
 tree.level_queue(tree.root)

 print '\n\n递归实现前序遍历:'
 tree.front_recursion(tree.root)
 print '\n递归实现中序遍历:'
 tree.middle_recursion(tree.root)
 print '\n递归实现后序遍历:'
 tree.back_recursion(tree.root)

 print '\n\n堆栈实现前序遍历:'
 tree.front_stack(tree.root)
 print '\n堆栈实现中序遍历:'
 tree.middle_stack(tree.root)
 print '\n堆栈实现后序遍历:'
 tree.back_stack(tree.root)

需要源码的小伙伴可自行下载:代码传送门

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python操作ie登陆土豆网的方法
May 09 Python
Python遍历目录中的所有文件的方法
Jul 08 Python
wxpython中自定义事件的实现与使用方法分析
Jul 21 Python
python使用正则表达式的search()函数实现指定位置搜索功能
Nov 10 Python
使用Python通过win32 COM打开Excel并添加Sheet的方法
May 02 Python
Python根据指定日期计算后n天,前n天是哪一天的方法
May 29 Python
如何用Python实现简单的Markdown转换器
Jul 16 Python
python cs架构实现简单文件传输
Mar 20 Python
浅谈python requests 的put, post 请求参数的问题
Jan 02 Python
django API 中接口的互相调用实例
Apr 01 Python
python 用struct模块解决黏包问题
Nov 07 Python
python pandas 解析(读取、写入)CSV 文件的操作方法
Dec 24 Python
python的内存管理和垃圾回收机制详解
May 18 #Python
Django处理多用户类型的方法介绍
May 18 #Python
Django 配置多站点多域名的实现步骤
May 17 #Python
将Python字符串生成PDF的实例代码详解
May 17 #Python
Python Django框架单元测试之文件上传测试示例
May 17 #Python
Python django框架应用中实现获取访问者ip地址示例
May 17 #Python
Python Django框架实现应用添加logging日志操作示例
May 17 #Python
You might like
基于PHP导出Excel的小经验 完美解决乱码问题
2013/06/10 PHP
php中OR与|| AND与&&的区别总结
2013/10/26 PHP
PHP实现删除非站内外部链接实例代码
2014/06/17 PHP
php密码生成类实例
2014/09/24 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
2014/10/30 PHP
ECSHOP在PHP5.5及高版本上报错的解决方法
2015/08/31 PHP
PHP微信开发之模板消息回复
2016/06/24 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
初学Javascript的一些总结
2008/11/03 Javascript
JS添加删除一组文本框并对输入信息加以验证判断其正确性
2013/04/11 Javascript
详谈jQuery中的this和$(this)
2014/11/13 Javascript
JavaScript监听文本框回车事件并过滤文本框空格的方法
2015/04/16 Javascript
jQuery.form.js插件不能解决连接超时(timeout)的原因分析及解决方法
2016/10/14 Javascript
JS实现重新加载当前页面
2016/11/29 Javascript
vue路由守卫,限制前端页面访问权限的例子
2019/11/11 Javascript
vscode 插件开发 + vue的操作方法
2020/06/05 Javascript
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
2015/08/16 Python
Python的网络编程库Gevent的安装及使用技巧
2016/06/24 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
2018/06/13 Python
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
python 列表递归求和、计数、求最大元素的实例
2018/11/28 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
Python实现字符串中某个字母的替代功能
2019/10/21 Python
Python 实现向word(docx)中输出
2020/02/13 Python
PyTorch中的C++扩展实现
2020/04/02 Python
纯css3实现的动画按钮的实例教程
2014/11/17 HTML / CSS
德国游戏机商店:Konsolenkost
2019/12/08 全球购物
西班牙购买隐形眼镜、眼镜和太阳镜网站:Lentiamo.es
2020/06/11 全球购物
园林毕业生自我鉴定范文
2013/12/29 职场文书
落实八项规定专题民主生活会对照检查材料
2014/09/15 职场文书
报到证办理个人委托书
2014/10/06 职场文书
运动会广播稿200字
2014/10/18 职场文书
2014年师德师风工作总结
2014/11/25 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
详细谈谈JavaScript中循环之间的差异
2021/08/23 Javascript
Java版 简易五子棋小游戏
2022/05/04 Java/Android