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计数排序和基数排序算法实例
Apr 25 Python
python基于windows平台锁定键盘输入的方法
Mar 05 Python
Ruby元编程基础学习笔记整理
Jul 02 Python
Python 正则表达式入门(中级篇)
Dec 07 Python
浅谈flask截获所有访问及before/after_request修饰器
Jan 18 Python
使用python验证代理ip是否可用的实现方法
Jul 25 Python
pygame游戏之旅 调用按钮实现游戏开始功能
Nov 21 Python
Django框架使用内置方法实现登录功能详解
Jun 12 Python
解决python中导入win32com.client出错的问题
Jul 26 Python
学习和使用python的13个理由
Jul 30 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
Feb 21 Python
OpenCV全景图像拼接的实现示例
Jun 05 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编程与应用
2006/10/09 PHP
PHP 翻页 实例代码
2009/08/07 PHP
深入PHP内存相关的功能特性详解
2013/06/08 PHP
YII实现分页的方法
2014/07/09 PHP
PHP微信红包API接口
2015/12/05 PHP
WordPress中使主题支持小工具以及添加插件启用函数
2015/12/22 PHP
php常用数组函数实例小结
2016/12/29 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
js中的scroll和offset 使用比较的实例与分析
2013/09/29 Javascript
JS小游戏之宇宙战机源码详解
2014/09/25 Javascript
NodeJS学习笔记之Connect中间件应用实例
2015/01/27 NodeJs
浅谈js图片前端预览之filereader和window.URL.createObjectURL
2016/06/30 Javascript
nodejs express配置自签名https服务器的方法
2018/05/22 NodeJs
babel7.x和webpack4.x配置vue项目的方法步骤
2019/05/12 Javascript
vue element-ui读取pdf文件的方法
2019/11/26 Javascript
原生JS实现天气预报
2020/06/16 Javascript
Postman环境变量全局变量使用方法详解
2020/08/13 Javascript
jQuery实现穿梭框效果
2021/01/19 jQuery
Python读写Redis数据库操作示例
2014/03/18 Python
Python深入06——python的内存管理详解
2016/12/07 Python
200 行python 代码实现 2048 游戏
2018/01/12 Python
python3第三方爬虫库BeautifulSoup4安装教程
2018/06/19 Python
python 美化输出信息的实例
2018/10/15 Python
python单例模式的多种实现方法
2019/07/26 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
基于plt.title无法显示中文的快速解决
2020/05/16 Python
新手学python应该下哪个版本
2020/06/11 Python
土耳其新趋势女装购物网站:Addax
2020/01/07 全球购物
香港百佳网上超级市场:PARKNSHOP.com
2020/06/10 全球购物
单位委托书范本(3篇)
2014/09/18 职场文书
基层党员四风问题自我剖析材料
2014/09/29 职场文书
数学教师个人总结
2015/02/06 职场文书
蓝天保卫战收官在即 :15行业将开展环保分级评价
2019/07/19 职场文书
pytorch实现线性回归以及多元回归
2021/04/11 Python
pytorch 运行一段时间后出现GPU OOM的问题
2021/06/02 Python
mysql配置SSL证书登录的实现
2021/09/04 MySQL