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中运行并行任务技巧
Feb 26 Python
python实现发送邮件功能代码
Dec 14 Python
python人民币小写转大写辅助工具
Jun 20 Python
基于Python的Post请求数据爬取的方法详解
Jun 14 Python
Java ExcutorService优雅关闭方式解析
May 30 Python
python dict乱码如何解决
Jun 07 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
Aug 27 Python
浅析NumPy 切片和索引
Sep 02 Python
Python模块常用四种安装方式
Oct 20 Python
如何用python批量调整视频声音
Dec 22 Python
python使用pygame创建精灵Sprite
Apr 06 Python
Python探索生命起源 matplotlib细胞自动机动画演示
Apr 21 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代码的53条建议
2008/03/27 PHP
有道搜索和IP138的IP的API接口(PHP应用)
2012/11/29 PHP
PHP性能优化大全(php.ini)
2016/05/20 PHP
传递参数的标准方法(jQuery.ajax)
2008/11/19 Javascript
JavaScript Konami Code 实现代码
2009/07/29 Javascript
基于Bootstrap实现图片轮播效果
2016/05/22 Javascript
jQuery实现倒计时(倒计时年月日可自己输入)
2016/12/02 Javascript
javascript实现二叉树的代码
2017/06/08 Javascript
vue组件三大核心概念图文详解
2019/05/30 Javascript
ES6中字符串的使用方法扩展
2019/06/04 Javascript
Layui点击图片弹框预览的实现方法
2019/09/16 Javascript
JS自定义右键菜单实现代码解析
2020/07/16 Javascript
jQuery中event.target和this的区别详解
2020/08/13 jQuery
python按键按住不放持续响应的实例代码
2019/07/17 Python
python类中super() 的使用解析
2019/12/19 Python
Python 模拟动态产生字母验证码图片功能
2019/12/24 Python
Python Numpy库常见用法入门教程
2020/01/16 Python
如何一键升级Python所有包
2020/11/05 Python
HTML5 video 视频标签使用介绍
2014/02/03 HTML / CSS
洛杉矶健身中心女性专用运动服饰品牌:Marika
2018/05/09 全球购物
Subside Sports德国:足球球衣和球迷商品
2019/06/08 全球购物
库存图片、照片、矢量图、视频和音乐:Shutterstock
2021/02/12 全球购物
商务英语专业自荐信
2013/10/14 职场文书
服务中心夜班服务员岗位职责
2013/11/27 职场文书
质检部职责
2013/12/28 职场文书
工程造价专业大学生职业规划范文
2014/03/09 职场文书
气象学专业个人求职信
2014/03/15 职场文书
诉讼代理人授权委托书
2014/04/08 职场文书
党的群众路线教育实践活动组织生活会发言材料
2014/10/17 职场文书
政工师工作总结2015
2015/05/26 职场文书
农村婚庆主持词
2015/06/29 职场文书
教师岗位说明书
2015/09/30 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书
浅谈Python项目的服务器部署
2021/04/25 Python
go结构体嵌套的切片数组操作
2021/04/28 Golang
golang 实现Location跳转方式
2021/05/02 Golang