Python二叉树的定义及常用遍历算法分析


Posted in Python onNovember 24, 2017

本文实例讲述了Python二叉树的定义及常用遍历算法。分享给大家供大家参考,具体如下:

说起二叉树的遍历,大学里讲的是递归算法,大多数人首先想到也是递归算法。但作为一个有理想有追求的程序员。也应该学学非递归算法实现二叉树遍历。二叉树的非递归算法需要用到辅助栈,算法着实巧妙,令人脑洞大开。

以下直入主题:

定义一颗二叉树,请看官自行想象其形状,

class BinNode( ):
  def __init__( self, val ):
    self.lchild = None
    self.rchild = None
    self.value = val
binNode1 = BinNode( 1 )
binNode2 = BinNode( 2 )
binNode3 = BinNode( 3 )
binNode4 = BinNode( 4 )
binNode5 = BinNode( 5 )
binNode6 = BinNode( 6 )
binNode1.lchild = binNode2
binNode1.rchild = binNode3
binNode2.lchild = binNode4
binNode2.rchild = binNode5
binNode3.lchild = binNode6

先序遍历:

'''
先序遍历二叉树
'''
def bin_tree_pre_order_traverse( root, visit_func ):
  s = Stack()
  s.push( root )
  while not s.is_empty():
    node = s.pop()
    visit_func( node )
    if node.rchild:
      s.push( node.rchild )
    if node.lchild:
      s.push( node.lchild )

中序遍历:

'''
中序遍历二叉树
'''
def bin_tree_in_order_traverse( root, visit_func ):
  s = Stack()
  node = root
  while node or not s.is_empty():
    if node:
      s.push( node )
      node = node.lchild
    else:
      node = s.pop()
      visit_func( node )
      node = node.rchild

后序遍历:

后序遍历中,要保证左孩子和右孩子都已被访问才能访问根结点,并且左孩子需在右孩子前访问,这就为流程的控制带来了难题。下面介绍两种思路。

思路一,双栈法,这种方式比较容易理解,缺点是需要两个栈。

'''
后序遍历二叉树
'''
def bin_tree_post_order_traverse( root, visit_func ):
  s1 = Stack()
  s2 = Stack()
  s1.push( root )
  while not s1.is_empty():
    node = s1.pop()
    s2.push( node )
    if node.lchild:
      s1.push( node.lchild )
    if node.rchild:
      s1.push( node.rchild )
  while not s2.is_empty():
    visit_func( s2.pop() )

思路二,要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。

def bin_tree_post_order_traverse2( root, visit_func ):
  curr = root
  prev = None
  s = Stack()
  s.push( curr )
  while not s.is_empty():
    curr = s.peek()
    if ( not curr.lchild and not curr.rchild ) or ( prev and ( prev == curr.lchild or prev == curr.rchild ) ):
      visit_func( curr )
      s.pop()


 prev = curr
    else:
      if curr.rchild:
        s.push( curr.rchild )
      if curr.lchild:
        s.push( curr.lchild )

层序遍历:

def bin_tree_level_traverse( root, visit_func ):
  queue = Queue()
  queue.enqueue( root )
  while not queue.is_empty():
    node = queue.dequeue().value
    visit_func( node )
    if node.lchild:
      queue.enqueue( node.lchild )
    if node.rchild:
      queue.enqueue( node.rchild )

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python二维码生成库qrcode安装和使用示例
Dec 16 Python
python实现矩阵乘法的方法
Jun 28 Python
Python实现按特定格式对文件进行读写的方法示例
Nov 30 Python
Python中pow()和math.pow()函数用法示例
Feb 11 Python
详解Python with/as使用说明
Dec 13 Python
python+webdriver自动化环境搭建步骤详解
Jun 03 Python
Python实现计算对象的内存大小示例
Jul 10 Python
Python3并发写文件与Python对比
Nov 20 Python
python3安装OCR识别库tesserocr过程图解
Apr 02 Python
Python requests及aiohttp速度对比代码实例
Jul 16 Python
python内置进制转换函数的操作
Jun 02 Python
Python中request的基本使用解决乱码问题
Apr 12 Python
详解python上传文件和字符到PHP服务器
Nov 24 #Python
Python实现矩阵转置的方法分析
Nov 24 #Python
利用Django内置的认证视图实现用户密码重置功能详解
Nov 24 #Python
利用python3随机生成中文字符的实现方法
Nov 24 #Python
Python内置函数 next的具体使用方法
Nov 24 #Python
python中WSGI是什么,Python应用WSGI详解
Nov 24 #Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
Nov 24 #Python
You might like
建立文件交换功能的脚本(三)
2006/10/09 PHP
傻瓜化配置PHP环境――Appserv
2006/12/13 PHP
php常用的安全过滤函数集锦
2014/10/09 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
2016/01/08 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
wordpress自定义标签云与随机获取标签的方法详解
2019/03/22 PHP
基于jQuery的投票系统显示结果插件
2011/08/12 Javascript
JavaScript高级程序设计 阅读笔记(十二) js内置对象Math
2012/08/14 Javascript
document.getElementBy("id")与$("#id")有什么区别
2013/09/22 Javascript
jquery 快速回到页首的方法
2013/12/05 Javascript
JavaScript中循环遍历Array与Map的方法小结
2016/03/12 Javascript
jquery对象访问是什么及使用方法介绍
2016/05/03 Javascript
怎么引入(调用)一个JS文件
2016/05/26 Javascript
JS获取多维数组中相同键的值实现方法示例
2017/01/06 Javascript
angular使用post、get向后台传参的问题实例
2017/05/27 Javascript
浅谈angular4 ng-content 中隐藏的内容
2017/08/18 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
2019/01/06 Javascript
Javascript读取上传文件内容/类型/字节数
2019/04/30 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
2020/07/13 Javascript
python一键升级所有pip package的方法
2017/01/16 Python
python使用RNN实现文本分类
2018/05/24 Python
seek引发的python文件读写的问题及解决
2019/07/26 Python
python Event事件、进程池与线程池、协程解析
2019/10/25 Python
python实现经纬度采样的示例代码
2020/12/10 Python
科尔士百货公司官网:Kohl’s
2016/07/11 全球购物
秋季运动会表扬稿
2014/01/16 职场文书
毕业生自荐信格式
2014/03/07 职场文书
大型会议策划方案
2014/05/17 职场文书
汉语言文学专业自荐信
2014/06/11 职场文书
物资采购方案
2014/06/12 职场文书
中职三好学生事迹材料
2014/08/24 职场文书
房屋产权证明书
2014/10/15 职场文书
给校长的建议书范文
2015/09/14 职场文书
家电创业计划书
2019/08/05 职场文书
详解Java实践之适配器模式
2021/06/18 Java/Android
Python使用OpenCV实现虚拟缩放效果
2022/02/28 Python