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正则表达式操作指南(re使用)
Sep 06 Python
python连接mysql调用存储过程示例
Mar 05 Python
Python3实现连接SQLite数据库的方法
Aug 23 Python
ubuntu系统下 python链接mysql数据库的方法
Jan 09 Python
Python 中的range(),以及列表切片方法
Jul 02 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
Oct 11 Python
用python 实现在不确定行数情况下多行输入方法
Jan 28 Python
python获取交互式ssh shell的方法
Feb 14 Python
Python 读取串口数据,动态绘图的示例
Jul 02 Python
使用django的ORM框架按月统计近一年内的数据方法
Jul 18 Python
Django 实现xadmin后台菜单改为中文
Nov 15 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
Apr 22 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自动获取目录下的模板的代码
2010/08/08 PHP
php实现保存submit内容之后禁止刷新
2014/03/19 PHP
64位windows系统下安装Memcache缓存
2015/12/06 PHP
php文件类型MIME对照表(比较全)
2016/10/07 PHP
PHP+mysql实现的三级联动菜单功能示例
2019/02/15 PHP
地址栏上的一段语句,改变页面的风格。(教程)
2008/04/02 Javascript
jQuery 1.8 Release版本发布了
2012/08/14 Javascript
jquery基础教程之deferred对象使用方法
2014/01/22 Javascript
jquery无法设置checkbox选中即没有变成选中状态
2014/03/27 Javascript
jQuery中:animated选择器用法实例
2014/12/29 Javascript
基于jQuery实现多层次的手风琴效果附源码
2015/09/21 Javascript
理解javascript中DOM事件
2015/12/25 Javascript
详解javascript跨浏览器事件处理程序
2016/03/27 Javascript
JavaScript操作选择对象的简单实例
2016/05/16 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
2016/10/28 Javascript
移动端吸顶fixbar的解决方案详解
2019/07/17 Javascript
Python中用PIL库批量给图片加上序号的教程
2015/05/06 Python
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
python实现手机通讯录搜索功能
2018/02/22 Python
python爬虫简单的添加代理进行访问的实现代码
2019/04/04 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
Python基于smtplib协议实现发送邮件
2020/06/03 Python
matplotlib subplot绘制多个子图的方法示例
2020/07/28 Python
Python中常用的os操作汇总
2020/11/05 Python
prAna官网:瑜伽、旅行和冒险服装
2019/03/10 全球购物
澳大利亚领先的女性运动服品牌:Lorna Jane
2020/06/19 全球购物
如何掌握自荐信格式呢
2013/11/19 职场文书
幼儿园亲子活动方案
2014/01/29 职场文书
荷叶圆圆教学反思
2014/02/01 职场文书
《乌塔》教学反思
2014/02/17 职场文书
《一件运动衫》教学反思
2014/02/19 职场文书
雾霾停课通知
2015/04/24 职场文书
大学生村官入党自传
2015/06/26 职场文书
赞助商致辞
2015/07/30 职场文书
mysql 8.0.24版本安装配置方法图文教程
2021/05/12 MySQL
OpenCV图像变换之傅里叶变换的一些应用
2021/07/26 Python