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实现备份文件实例
Sep 16 Python
python类和继承用法实例
Jul 07 Python
利用python代码写的12306订票代码
Dec 20 Python
Python实现的用户登录系统功能示例
Feb 05 Python
python3中函数参数的四种简单用法
Jul 09 Python
Python Flask框架模板操作实例分析
May 03 Python
Python利用sqlacodegen自动生成ORM实体类示例
Jun 04 Python
Django如何自定义model创建数据库索引的顺序
Jun 20 Python
Python:Numpy 求平均向量的实例
Jun 29 Python
OpenCV Python实现拼图小游戏
Mar 23 Python
python用Configobj模块读取配置文件
Sep 26 Python
Python Tkinter实例——模拟掷骰子
Oct 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 a simple smtp class
2007/11/26 PHP
header跳转和include包含问题详解
2012/09/08 PHP
PHP cdata 处理(详细介绍)
2013/07/05 PHP
CodeIgniter基本配置详细介绍
2013/11/12 PHP
JavaScript多线程的实现方法
2007/05/08 Javascript
用js模拟JQuery的show与hide动画函数代码
2010/09/20 Javascript
JS延迟加载加快页面打开速度示例代码
2013/12/30 Javascript
js单词形式的运算符
2014/05/06 Javascript
多引号嵌套的变量命名的问题
2014/05/09 Javascript
jquery实现从数组移除指定的值
2015/06/24 Javascript
详解vue-cil和webpack中本地静态图片的路径问题解决方案
2017/09/27 Javascript
Angular中sweetalert弹框的基本使用教程
2018/07/22 Javascript
vue-cli安装使用流程步骤详解
2018/11/08 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
vue中uni-app 实现小程序登录注册功能
2019/10/12 Javascript
在vue中对数组值变化的监听与重新响应渲染操作
2020/07/17 Javascript
python 排序算法总结及实例详解
2016/09/28 Python
Python使用修饰器执行函数的参数检查功能示例
2017/09/26 Python
浅谈pytorch和Numpy的区别以及相互转换方法
2018/07/26 Python
Python二叉树的镜像转换实现方法示例
2019/03/06 Python
python3实现猜数字游戏
2020/12/07 Python
Python csv模块使用方法代码实例
2019/08/29 Python
Python3 实现减少可调用对象的参数个数
2019/12/20 Python
基于Python爬取51cto博客页面信息过程解析
2020/08/25 Python
HTML5中的nav标签学习笔记
2016/06/24 HTML / CSS
详解FireFox下Canvas使用图像合成绘制SVG的Bug
2019/07/10 HTML / CSS
高中生期末评语
2014/01/28 职场文书
小学数学教学反思
2014/02/02 职场文书
运动会开幕式邀请函
2014/02/03 职场文书
《乌塔》教学反思
2014/02/17 职场文书
搞笑征婚广告词
2014/03/17 职场文书
个人求职自荐信范文
2015/03/06 职场文书
学习焦裕禄观后感
2015/06/09 职场文书
Python - 10行代码集2000张美女图
2021/05/23 Python
Pyqt5将多个类组合在一个界面显示的完整示例
2021/09/04 Python
python自动化测试通过日志3分钟定位bug
2021/11/20 Python