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 cookielib 登录人人网的实现代码
Dec 19 Python
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
Aug 22 Python
Flask框架中密码的加盐哈希加密和验证功能的用法详解
Jun 07 Python
最大K个数问题的Python版解法总结
Jun 16 Python
Python实现的文轩网爬虫完整示例
May 16 Python
python创建子类的方法分析
Nov 28 Python
tensorflow 获取所有variable或tensor的name示例
Jan 04 Python
利用python实现.dcm格式图像转为.jpg格式
Jan 13 Python
浅谈Python中的异常和JSON读写数据的实现
Feb 27 Python
Python流程控制语句的深入讲解
Jun 15 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
Jul 01 Python
Keras搭建自编码器操作
Jul 03 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
用php获取本周,上周,本月,上月,本季度日期的代码
2009/08/05 PHP
php处理json时中文问题的解决方法
2011/04/12 PHP
解析获取优酷视频真实下载地址的PHP源代码
2013/06/26 PHP
PHP header()函数常用方法总结
2014/04/11 PHP
使用PHPExcel操作Excel用法实例分析
2015/03/26 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
2017/03/17 PHP
ajax提交表单实现网页无刷新注册示例
2014/05/08 Javascript
jquery实现相册一下滑动两次的方法
2015/02/09 Javascript
javascript函数特点实例分析
2015/05/14 Javascript
angular2使用简单介绍
2016/03/01 Javascript
JQuery日期插件datepicker的使用方法
2016/03/03 Javascript
jQuery Ajax 全局调用封装实例代码详解
2016/06/02 Javascript
vue proxyTable 接口跨域请求调试的示例
2017/09/12 Javascript
JavaScript代码模拟鼠标自动点击事件示例
2020/08/07 Javascript
[01:03:47]VP vs NewBee Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
[01:10:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第一场 3月4日
2021/03/11 DOTA
讲解python参数和作用域的使用
2013/11/01 Python
python机器学习之神经网络(一)
2017/12/20 Python
Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)
2018/04/05 Python
如何利用python查找电脑文件
2018/04/27 Python
python Tkinter版学生管理系统
2019/02/20 Python
python IDLE 背景以及字体大小的修改方法
2019/07/12 Python
Python基于os.environ从windows获取环境变量
2020/06/09 Python
Django项目创建及管理实现流程详解
2020/10/13 Python
css3 pointer-events 介绍详解
2017/09/18 HTML / CSS
Html5新标签解释及用法
2012/02/17 HTML / CSS
印尼旅游网站:via
2017/11/12 全球购物
经贸专业毕业生求职信范文
2014/05/01 职场文书
处级领导干部四风问题自我剖析材料
2014/09/29 职场文书
2014年手术室工作总结
2014/11/26 职场文书
中学生自我评价2015
2015/03/03 职场文书
2015年电话客服工作总结
2015/05/18 职场文书
小学家长意见怎么写
2015/06/03 职场文书
基于flask实现五子棋小游戏
2021/05/25 Python
SpringBoot工程下使用OpenFeign的坑及解决
2021/07/02 Java/Android
win10电脑关机快捷键是哪个 win10快速关机的几种方法
2022/08/14 数码科技