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使用urllib2获取网络资源实例讲解
Dec 02 Python
Python中规范定义命名空间的一些建议
Jun 04 Python
深入解析Python中的上下文管理器
Jun 28 Python
JavaScript中的模拟事件和自定义事件实例分析
Jul 27 Python
使用python实现快速搭建简易的FTP服务器
Sep 12 Python
基于python二叉树的构造和打印例子
Aug 09 Python
Python collections.defaultdict模块用法详解
Jun 18 Python
Python Tricks 使用 pywinrm 远程控制 Windows 主机的方法
Jul 21 Python
python实现自动清理重复文件
Aug 24 Python
python Selenium 库的使用技巧
Oct 16 Python
python中not、and和or的优先级与详细用法介绍
Nov 03 Python
解决pytorch 模型复制的一些问题
Mar 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执行速度全攻略(上)
2006/10/09 PHP
PHP语法速查表
2006/12/06 PHP
php多文件上传下载示例分享
2014/02/20 PHP
ThinkPHP CURD方法之table方法详解
2014/06/18 PHP
ThinkPHP模板判断输出Empty标签用法详解
2014/06/30 PHP
PHP实现指定字段的多维数组排序函数分享
2015/03/09 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
2015/08/21 PHP
Laravel中错误与异常处理的用法示例
2018/09/16 PHP
jQuery 浮动广告实现代码
2008/12/25 Javascript
window.location.hash 属性使用说明
2010/03/20 Javascript
深入理解JavaScript是如何实现继承的
2013/12/12 Javascript
jQuery移除tr无效的解决方法(tr是动态添加)
2014/09/22 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
2016/05/10 Javascript
jQuery选择器及jquery案例详解(必看)
2016/05/20 Javascript
浅谈express 中间件机制及实现原理
2017/08/31 Javascript
浅谈webpack打包过程中因为图片的路径导致的问题
2018/02/21 Javascript
react 实现页面代码分割、按需加载的方法
2018/04/03 Javascript
JavaScript引用类型Function实例详解
2018/08/09 Javascript
javascript设计模式之装饰者模式
2020/01/30 Javascript
Antd的Table组件嵌套Table以及选择框联动操作
2020/10/24 Javascript
通过JS判断网页是否为手机打开
2020/10/28 Javascript
[04:47]DOTA2-潍坊风行电子俱乐部探秘
2014/08/08 DOTA
[01:14:30]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第二场 8.20.mp4
2019/08/22 DOTA
Python使用urllib2模块实现断点续传下载的方法
2015/06/17 Python
Python cx_freeze打包工具处理问题思路及解决办法
2016/02/13 Python
Python中的groupby分组功能的实例代码
2018/07/11 Python
浅谈Python批处理文件夹中的txt文件
2019/03/11 Python
使用python telnetlib批量备份交换机配置的方法
2019/07/25 Python
浅谈Pytorch中的torch.gather函数的含义
2019/08/18 Python
环保口号大全
2014/06/12 职场文书
党性分析自查总结
2014/10/14 职场文书
公司租车协议书
2015/01/29 职场文书
2015年技术员工作总结
2015/04/10 职场文书
红高粱观后感
2015/06/10 职场文书
导游词之山东八大关
2019/12/18 职场文书
mybatis 解决从列名到属性名的自动映射失败问题
2021/06/30 Java/Android