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 开发者节省时间的10个方法
Oct 02 Python
python记录程序运行时间的三种方法
Jul 14 Python
Django查询数据库的性能优化示例代码
Sep 24 Python
Python编程实现线性回归和批量梯度下降法代码实例
Jan 04 Python
python版opencv摄像头人脸实时检测方法
Aug 03 Python
图文详解python安装Scrapy框架步骤
May 20 Python
python实现两张图片拼接为一张图片并保存
Jul 16 Python
Django集成celery发送异步邮件实例
Dec 17 Python
OpenCV哈里斯(Harris)角点检测的实现
Jan 15 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
Feb 09 Python
python实现udp聊天窗口
Mar 31 Python
MoviePy简介及Python视频剪辑自动化
Dec 18 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
phpMyAdmin2.11.6安装配置方法
2008/08/24 PHP
PHP中去掉字符串首尾空格的方法
2012/05/19 PHP
PHP验证码函数代码(简单实用)
2013/09/29 PHP
php管理nginx虚拟主机shell脚本实例
2014/11/19 PHP
php按单词截取字符串的方法
2015/04/07 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
2017/11/25 PHP
PHP钩子实现方法解析
2019/05/21 PHP
PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析
2019/12/11 PHP
javascript修改表格背景色实例代码分享
2013/12/10 Javascript
JS实现的页面自定义滚动条效果
2015/10/26 Javascript
Node.js+Express配置入门教程
2016/05/19 Javascript
Angularjs的Controller间通信机制实例分析
2016/11/07 Javascript
详解Node.js模板引擎Jade入门
2018/01/19 Javascript
node+express框架中连接使用mysql(经验总结)
2018/11/10 Javascript
浅谈webpack+react多页面开发终极架构
2018/11/11 Javascript
Node.js 实现简单的无侵入式缓存框架的方法
2019/07/21 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
Vue父子之间值传递的实例教程
2020/07/02 Javascript
JavaScript中遍历的十种方法总结
2020/12/15 Javascript
python遍历文件夹并删除特定格式文件的示例
2014/03/05 Python
总结Python编程中三条常用的技巧
2015/05/11 Python
详解如何使用Python编写vim插件
2017/11/28 Python
pyqt5实现登录界面的模板
2020/05/30 Python
Django 全局的static和templates的使用详解
2019/07/19 Python
python读写csv文件并增加行列的实例代码
2019/08/01 Python
对YOLOv3模型调用时候的python接口详解
2019/08/26 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
2020/01/18 Python
浅谈Keras中shuffle和validation_split的顺序
2020/06/19 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
2020/10/27 Python
英国羊绒服装购物网站:Pure Collection
2018/10/22 全球购物
为什么要有struct关键字
2012/05/08 面试题
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/04/11 面试题
珍爱生命演讲稿
2014/05/10 职场文书
公司会议开幕词
2015/01/29 职场文书
老公婚前保证书
2015/02/28 职场文书
python Tkinter的简单入门教程
2021/04/11 Python