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 相关文章推荐
rhythmbox中文名乱码问题解决方法
Sep 06 Python
Python语言技巧之三元运算符使用介绍
Mar 04 Python
python简单实现获取当前时间
Aug 27 Python
详解使用python的logging模块在stdout输出的两种方法
May 17 Python
Django中cookie的基本使用方法示例
Feb 03 Python
tensorflow 获取模型所有参数总和数量的方法
Jun 14 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
Aug 07 Python
对Python实现累加函数的方法详解
Jan 23 Python
python替换字符串中的子串图文步骤
Jun 19 Python
Python高级编程之继承问题详解(super与mro)
Nov 19 Python
Python 去除字符串中指定字符串
Mar 05 Python
Python连接mysql数据库及简单增删改查操作示例代码
Aug 03 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 的ArrayAccess接口 像数组一样来访问你的PHP对象
2010/10/12 PHP
php中3种方法统计字符串中每种字符的个数并排序
2012/08/27 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
2016/01/07 PHP
PHP CURL实现模拟登陆并上传文件操作示例
2020/01/02 PHP
js onload事件不起作用示例分析
2013/10/09 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
2014/06/27 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
JavaScript中标识符提升问题
2015/06/11 Javascript
浅谈jquery.fn.extend与jquery.extend区别
2015/07/13 Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
2016/01/19 Javascript
基于JavaScript实现百叶窗动画效果不只单纯flas可以实现
2016/02/29 Javascript
JavaScript实现DOM对象选择器
2016/09/24 Javascript
详解javascript事件绑定使用方法
2016/10/20 Javascript
JavaScript调试的多个必备小Tips
2017/01/15 Javascript
javascript笔记之匿名函数和闭包
2017/02/06 Javascript
JS获取一个表单字段中多条数据并转化为json格式
2017/10/17 Javascript
Node层模拟实现multipart表单的文件上传示例
2018/01/02 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
2019/04/04 Javascript
微信小程序自定义tabBar在uni-app的适配详解
2019/09/30 Javascript
详解Java中String JSONObject JSONArray List转换
2020/11/13 Javascript
[00:57]深扒TI7聊天轮盘语音出处5
2017/05/11 DOTA
详解Python 实现元胞自动机中的生命游戏(Game of life)
2018/01/27 Python
Python3自动签到 定时任务 判断节假日的实例
2018/11/13 Python
Pandas之MultiIndex对象的示例详解
2019/06/25 Python
Python数据可视化:饼状图的实例讲解
2019/12/07 Python
Python Tornado批量上传图片并显示功能
2020/03/26 Python
css3.0 图形构成实例练习二
2013/03/19 HTML / CSS
Canvas绘制浮动球效果的示例
2017/12/29 HTML / CSS
意大利奢侈品牌在线精品店:Jole.it
2020/11/23 全球购物
教师职称自我鉴定
2014/02/12 职场文书
综合素质自我评价怎么写
2014/09/14 职场文书
个人三严三实对照检查材料
2014/09/25 职场文书
2014年镇党建工作汇报材料
2014/11/02 职场文书
《丑小鸭》教学反思
2016/02/19 职场文书
公司与个人合作协议书
2016/03/19 职场文书