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 18 Python
python机器人行走步数问题的解决
Jan 29 Python
python如何对实例属性进行类型检查
Mar 20 Python
使用Python获取网段IP个数以及地址清单的方法
Nov 01 Python
对Python+opencv将图片生成视频的实例详解
Jan 08 Python
对Python中TKinter模块中的Label组件实例详解
Jun 14 Python
python elasticsearch从创建索引到写入数据的全过程
Aug 04 Python
pytorch实现focal loss的两种方式小结
Jan 02 Python
python圣诞树编写实例详解
Feb 13 Python
在python里创建一个任务(Task)实例
Apr 25 Python
python 模拟登陆github的示例
Dec 04 Python
解决Pymongo insert时会自动添加_id的问题
Dec 05 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用数组返回无限分类的列表数据的代码
2010/08/08 PHP
paypal即时到账php实现代码
2010/11/28 PHP
php dirname(__FILE__) 获取当前文件的绝对路径
2011/06/28 PHP
PHP 数组和字符串互相转换实现方法
2013/03/26 PHP
PHP文件上传处理案例分析
2016/10/15 PHP
详解PHP文件的自动加载(autoloading)
2018/02/04 PHP
window.location.hash 属性使用说明
2010/03/20 Javascript
目前流行的JavaScript库的介绍及对比
2013/09/29 Javascript
详解JavaScript中undefined与null的区别
2014/03/29 Javascript
jQuery对val和atrr("value")赋值的区别介绍
2014/09/26 Javascript
使用node.js 获取客户端信息代码分享
2014/11/26 Javascript
jQuery开源组件BootstrapValidator使用详解
2017/06/29 jQuery
如何通过非数字与字符的方式实现PHP WebShell详解
2017/07/02 Javascript
前端常见跨域解决方案(全)
2017/09/19 Javascript
jqgrid实现简单的单行编辑功能
2017/09/30 Javascript
vue父组件向子组件动态传值的两种方法
2017/11/11 Javascript
vue自定义指令directive实例详解
2018/01/17 Javascript
JavaScript生成指定范围随机数和随机序列的方法
2018/05/05 Javascript
JavaScript原型链与继承操作实例总结
2018/08/24 Javascript
uni-app之APP和小程序微信授权方法
2019/05/09 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
2019/10/14 Javascript
Vue+abp微信扫码登录的实现代码示例
2020/01/06 Javascript
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
python实现根据文件关键字进行切分为多个文件的示例
2018/12/10 Python
python获取磁盘号下盘符步骤详解
2019/06/19 Python
python2.7的flask框架之引用js&css等静态文件的实现方法
2019/08/22 Python
Python中使用gflags实例及原理解析
2019/12/13 Python
pyCharm 实现关闭代码检查
2020/06/09 Python
时尚圣经:The Fashion Bible
2019/03/03 全球购物
新任教师自我鉴定
2014/02/24 职场文书
婚前协议书
2014/04/15 职场文书
社区党建工作汇报材料
2014/08/14 职场文书
个人反四风对照检查材料思想汇报
2014/09/23 职场文书
银行授权委托书范本
2014/10/04 职场文书
大学迎新生的欢迎词
2019/06/25 职场文书
Python安装及建立虚拟环境的完整步骤
2022/06/25 Servers