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 相关文章推荐
Python2.x中str与unicode相关问题的解决方法
Mar 30 Python
Python赋值语句后逗号的作用分析
Jun 08 Python
python实现爬虫统计学校BBS男女比例(一)
Dec 31 Python
Python实现获取命令行输出结果的方法
Jun 10 Python
python基础教程项目四之新闻聚合
Apr 02 Python
Python 判断文件或目录是否存在的实例代码
Jul 19 Python
python3.6使用urllib完成下载的实例
Dec 19 Python
python 在指定范围内随机生成不重复的n个数实例
Jan 28 Python
Python搭建Spark分布式集群环境
Jul 05 Python
centos7之Python3.74安装教程
Aug 15 Python
Python魔术方法专题
Jun 19 Python
Win10环境中如何实现python2和python3并存
Jul 20 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递归调用与静态变量使用
2012/12/16 PHP
JavaScript实现滚动栏效果的方法
2015/04/27 PHP
PHP图形计数器程序显示网站用户浏览量
2016/07/20 PHP
php 中phar包的使用教程详解
2018/10/26 PHP
PHP addslashes()函数讲解
2019/02/03 PHP
PHP 7.4中使用预加载的方法详解
2019/07/08 PHP
jquery插件珍藏(图片局部放大/信息提示框)
2013/01/08 Javascript
jquery获取tagName再进行判断
2014/05/29 Javascript
用jquery实现动画跳到顶部和底部(这个比较简单)
2014/09/01 Javascript
jquery学习总结(超级详细)
2014/09/04 Javascript
jQuery UI插件自定义confirm确认框的方法
2015/03/20 Javascript
js设置document.domain实现跨域的注意点分析
2015/05/21 Javascript
jquery实现select选择框内容左右移动代码分享
2015/11/21 Javascript
Javascript页面跳转常见实现方式汇总
2015/11/28 Javascript
Js实现简单的小球运动特效
2016/02/18 Javascript
Node.js 中exports 和 module.exports 的区别
2017/03/14 Javascript
JavaScript操作文件_动力节点Java学院整理
2017/06/30 Javascript
使用vue实现grid-layout功能实例代码
2018/01/05 Javascript
angular实现页面打印局部功能的思考与方法
2018/04/13 Javascript
vue elementUI table表格数据 滚动懒加载的实现方法
2019/04/04 Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
2019/04/17 Javascript
微信小程序+云开发实现欢迎登录注册
2019/05/24 Javascript
Vue使用Clipboard.JS在h5页面中复制内容实例详解
2019/09/03 Javascript
numpy添加新的维度:newaxis的方法
2018/08/02 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
2018/10/14 Python
django 中的聚合函数,分组函数,F 查询,Q查询
2019/07/25 Python
Python中输入和输出(打印)数据实例方法
2019/10/13 Python
在Python 的线程中运行协程的方法
2020/02/24 Python
python 实现超级玛丽游戏
2020/11/25 Python
html5 的a标签 Href 拨电话的写法
2013/11/04 HTML / CSS
银行实习鉴定
2013/12/13 职场文书
党章学习思想汇报
2014/01/14 职场文书
《长城》教学反思
2014/02/14 职场文书
函授生自我鉴定
2014/03/25 职场文书
我读书我快乐演讲稿
2014/05/07 职场文书
小程序实现文字循环滚动动画
2021/06/14 Javascript