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使用smtplib模块通过gmail实现邮件发送的方法
May 08 Python
pymongo为mongodb数据库添加索引的方法
May 11 Python
Python中for循环和while循环的基本使用方法
Aug 21 Python
Django自定义分页与bootstrap分页结合
Feb 22 Python
python生成二维码的实例详解
Oct 29 Python
python机器学习理论与实战(六)支持向量机
Jan 19 Python
Python实现PS图像明亮度调整效果示例
Jan 23 Python
python获取文件真实链接的方法,针对于302返回码
May 14 Python
python pandas读取csv后,获取列标签的方法
Nov 12 Python
python opencv如何实现图片绘制
Jan 19 Python
python爬虫模块URL管理器模块用法解析
Feb 03 Python
Flask和pyecharts实现动态数据可视化
Feb 26 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 array_pop()数组函数将数组最后一个单元弹出(出栈)
2011/07/12 PHP
Linux下手动编译安装PHP扩展的例子分享
2014/07/15 PHP
ThinkPHP实现支付宝接口功能实例
2014/12/02 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
php-fpm添加service服务的例子
2018/04/27 PHP
指定js可访问其它域名的cookie的方法
2007/09/18 Javascript
javascript 面向对象编程 function也是类
2009/09/17 Javascript
ASP Json Parser修正版
2009/12/06 Javascript
Array.prototype.slice.apply的使用方法
2010/03/17 Javascript
Knockout text绑定DOM的使用方法
2013/11/15 Javascript
javascript使用数组的push方法完成快速排序
2014/09/15 Javascript
基于jQuery实现的图片切换焦点图整理
2014/12/07 Javascript
javascript实现自动输出文本(打字特效)
2015/08/27 Javascript
Node.js websocket使用socket.io库实现实时聊天室
2017/02/20 Javascript
JavaScript之promise_动力节点Java学院整理
2017/07/03 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
2017/09/21 Javascript
详解webpack模块化管理和打包工具
2018/04/21 Javascript
微信小程序实现topBar底部选择栏效果
2018/07/20 Javascript
详解Vue中的scoped及穿透方法
2019/04/18 Javascript
js回文数的4种判断方法示例
2019/06/04 Javascript
Python生成随机数的方法
2014/01/14 Python
常用python编程模板汇总
2016/02/12 Python
对pandas进行数据预处理的实例讲解
2018/04/20 Python
Python对接 xray 和微信实现自动告警
2019/09/17 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
Django自带的用户验证系统实现
2020/12/18 Python
介绍一下Java中的Class类
2015/04/10 面试题
Android interview questions
2016/12/25 面试题
《我不是最弱小的》教学反思
2014/02/23 职场文书
幼儿教师寄语集锦
2014/04/03 职场文书
班委竞选演讲稿
2014/04/28 职场文书
幼儿园运动会口号
2014/06/07 职场文书
导游词之重庆渣滓洞
2020/01/08 职场文书
Nginx反爬虫策略,防止UA抓取网站
2021/03/31 Servers
详解JS WebSocket断开原因和心跳机制
2021/05/07 Javascript
jackson json序列化实现首字母大写,第二个字母需小写
2021/06/29 Java/Android