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中的匿名函数使用简介
Apr 27 Python
python采集百度百科的方法
Jun 05 Python
Python序列操作之进阶篇
Dec 08 Python
详解python发送各类邮件的主要方法
Dec 22 Python
python 3.5下xadmin的使用及修复源码bug
May 10 Python
python实现AES加密和解密
Mar 27 Python
python实现简单五子棋游戏
Jun 18 Python
Python秒算24点实现及原理详解
Jul 29 Python
python 遍历pd.Series的index和value
Nov 26 Python
Python爬虫爬取百度搜索内容代码实例
Jun 05 Python
用Python爬取LOL所有的英雄信息以及英雄皮肤的示例代码
Jul 13 Python
Python json解析库jsonpath原理及使用示例
Nov 25 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读取和编写XML DOM的实现代码
2011/02/03 PHP
Yii实现自动加载类地图的方法
2015/04/01 PHP
PHP 设计模式系列之 specification规格模式
2016/01/10 PHP
php读取和保存base64编码的图片内容
2017/04/22 PHP
点击广告后才能获得下载地址
2006/10/26 Javascript
JS加ASP二级域名转向的代码
2007/05/17 Javascript
jQuery 处理网页内容的实现代码
2010/02/15 Javascript
解决JS浮点数运算出现Bug的方法
2013/03/12 Javascript
JS中数组Array的用法示例介绍
2014/02/20 Javascript
JavaScript中实现无缝滚动、分享到侧边栏实例代码
2016/04/06 Javascript
js获取客户端操作系统类型的方法【测试可用】
2016/05/27 Javascript
用js写的一个路由(简单实例)
2016/09/24 Javascript
jQuery中Datatables增加跳转到指定页功能
2017/02/08 Javascript
详解nodeJS之二进制buffer对象
2017/06/03 NodeJs
浅谈Angular2 ng-content 指令在组件中嵌入内容
2017/08/18 Javascript
JavaScript累加、迭代、穷举、递归等常用算法实例小结
2018/05/08 Javascript
angularjs $http调用接口的方式详解
2018/08/13 Javascript
vue组件之间通信实例总结(点赞功能)
2018/12/05 Javascript
深入浅出 Vue 系列 -- 数据劫持实现原理
2019/04/23 Javascript
Vue双向数据绑定(MVVM)的原理
2020/10/03 Javascript
[05:16]《大圣!大圣》——DOTA2新英雄齐天大圣配音李世宏老师专访
2016/12/13 DOTA
一波神奇的Python语句、函数与方法的使用技巧总结
2015/12/08 Python
Python自动化测试ConfigParser模块读写配置文件
2016/08/15 Python
Python的装饰器使用详解
2017/06/26 Python
Python操作mysql数据库实现增删查改功能的方法
2018/01/15 Python
python实现抖音视频批量下载
2018/06/20 Python
Python常见数字运算操作实例小结
2019/03/22 Python
详解django中Template语言
2020/02/22 Python
英国高档百货连锁店:John Lewis
2017/11/20 全球购物
迪卡侬印尼体育用品商店:Decathlon印尼
2020/03/11 全球购物
数控专业自荐书范文
2014/03/16 职场文书
2014年双拥工作总结
2014/11/21 职场文书
2015年教研员工作总结
2015/05/26 职场文书
理解深度学习之深度学习简介
2021/04/14 Python
python入门之算法学习
2021/04/22 Python
Spring Boot 实现 WebSocket
2022/04/30 Java/Android