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 22 Python
Python排序搜索基本算法之希尔排序实例分析
Dec 09 Python
详解Python 实现元胞自动机中的生命游戏(Game of life)
Jan 27 Python
使用pycharm生成代码模板的实例
May 23 Python
Django 批量插入数据的实现方法
Jan 12 Python
在python中利用pycharm自定义代码块教程(三步搞定)
Apr 15 Python
python 错误处理 assert详解
Apr 20 Python
基于打开pycharm有带图片md文件卡死问题的解决
Apr 24 Python
构建高效的python requests长连接池详解
May 02 Python
python中列表的含义及用法
May 26 Python
python 基于卡方值分箱算法的实现示例
Jul 17 Python
python获取带有返回值的多线程
May 02 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和MySQL保存和输出图片
2006/10/09 PHP
用PHP实现弹出消息提示框的两种方法
2013/12/17 PHP
php读取富文本的时p标签会出现红线是怎么回事
2014/05/13 PHP
简要剖析PHP的Yii框架的组件化机制的基本知识
2016/03/17 PHP
php探针使用原理和技巧讲解
2019/09/17 PHP
javascript 上下banner替换具体实现
2013/11/14 Javascript
JavaScript学习笔记之Cookie对象
2015/01/22 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
jQuery采用连缀写法实现的折叠菜单效果
2015/09/18 Javascript
javascript计时器编写过程与实现方法
2016/02/29 Javascript
jquery实现界面无刷新加载登陆注册
2016/07/30 Javascript
Vue开发过程中遇到的疑惑知识点总结
2017/01/20 Javascript
详解Vue监听数据变化原理
2017/03/08 Javascript
浅谈JS和jQuery的区别
2019/03/27 jQuery
功能完善的小程序日历组件的实现
2020/03/31 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
[49:58]完美世界DOTA2联赛PWL S3 Magma vs DLG 第一场 12.18
2020/12/19 DOTA
Python实现将HTML转换成doc格式文件的方法示例
2017/11/20 Python
对python 调用类属性的方法详解
2019/07/02 Python
python for和else语句趣谈
2019/07/02 Python
Python 硬币兑换问题
2019/07/29 Python
python利用re,bs4,requests模块获取股票数据
2019/07/29 Python
浅析pandas随机排列与随机抽样
2021/01/22 Python
铁路个人事迹材料
2014/01/30 职场文书
英语教师岗位职责
2014/03/16 职场文书
医学求职信
2014/05/28 职场文书
六一儿童节标语
2014/10/08 职场文书
交警正风肃纪剖析材料
2014/10/29 职场文书
安全保证书
2015/01/16 职场文书
总经理司机岗位职责
2015/04/10 职场文书
Django程序的优化技巧
2021/04/29 Python
goland设置颜色和字体的操作
2021/05/05 Golang
正确使用MySQL update语句
2021/05/26 MySQL
浅谈Go语言多态的实现与interface使用
2021/06/16 Golang
从QQtabBar看css命名规范BEM的详细介绍
2021/08/07 HTML / CSS
python和anaconda的区别
2022/05/06 Python