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 fabric实现远程操作和部署示例
Mar 25 Python
python使用正则表达式检测密码强度源码分享
Jun 11 Python
python实现连接mongodb的方法
May 08 Python
Python中的id()函数指的什么
Oct 17 Python
python3+PyQt5实现拖放功能
Apr 24 Python
Python3 列表,数组,矩阵的相互转换的方法示例
Aug 05 Python
python字典的遍历3种方法详解
Aug 10 Python
python实现大学人员管理系统
Oct 25 Python
Python tkinter实现简单加法计算器代码实例
May 13 Python
如何利用Python识别图片中的文字
May 31 Python
Python爬取豆瓣数据实现过程解析
Oct 27 Python
python 基于UDP协议套接字通信的实现
Jan 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之autoload运行机制实例分析
2014/08/28 PHP
Laravel 5框架学习之Laravel入门和新建项目
2015/04/07 PHP
PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)
2016/09/11 PHP
PHP使用PDO 连接与连接管理操作实例分析
2020/04/21 PHP
30分钟就入门的正则表达式基础教程
2013/02/25 Javascript
jQuery制作仿腾讯web qq用户体验桌面
2013/08/20 Javascript
JS正则验证邮箱的格式详细介绍
2013/11/19 Javascript
Javascript中的getUTCHours()方法使用详解
2015/06/10 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
JS小数转换为整数的方法分析
2017/01/07 Javascript
javascript中replace使用方法总结
2017/03/01 Javascript
JS构造一个html文本内容成文件流形式发送到后台
2018/07/31 Javascript
jquery实现选项卡切换代码实例
2019/05/14 jQuery
[01:10:48]完美世界DOTA2联赛PWL S2 GXR vs PXG 第一场 11.18
2020/11/18 DOTA
Python性能优化技巧
2015/03/09 Python
python实现将html表格转换成CSV文件的方法
2015/06/28 Python
Python对文件操作知识汇总
2016/05/15 Python
python中pika模块问题的深入探究
2018/10/13 Python
Python 元组操作总结
2019/09/18 Python
执行Python程序时模块报错问题
2020/03/26 Python
keras 获取某层的输入/输出 tensor 尺寸操作
2020/06/10 Python
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
类如何去实现接口
2013/12/19 面试题
爱岗敬业演讲稿范文
2014/01/14 职场文书
户外婚礼策划方案
2014/02/08 职场文书
优秀的导游求职信范文
2014/04/06 职场文书
承诺书格式
2014/06/03 职场文书
学校交通安全责任书
2014/08/25 职场文书
纪律教育月活动总结
2014/08/26 职场文书
医疗专业毕业生求职信
2014/08/28 职场文书
黄河绝恋观后感
2015/06/08 职场文书
证婚人致辞精选
2015/07/28 职场文书
详解mysql三值逻辑与NULL
2021/05/19 MySQL
Python获取指定日期是"星期几"的6种方法
2022/03/13 Python
asyncio异步编程之Task对象详解
2022/03/13 Python
win sever 2022如何占用操作主机角色
2022/06/25 Servers