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中输出ASCII大文字、艺术字、字符字小技巧
Apr 28 Python
初学python的操作难点总结(新手必看篇)
Aug 03 Python
Python编程实现使用线性回归预测数据
Dec 07 Python
python实现简单神经网络算法
Mar 10 Python
python实现简易动态时钟
Nov 19 Python
Python获取好友地区分布及好友性别分布情况代码详解
Jul 10 Python
Python脚本操作Excel实现批量替换功能
Nov 20 Python
python中的split()函数和os.path.split()函数使用详解
Dec 21 Python
python爬虫库scrapy简单使用实例详解
Feb 10 Python
Python字符串hashlib加密模块使用案例
Mar 10 Python
Python基础教程(一)——Windows搭建开发Python开发环境
Jul 20 Python
Pandas 稀疏数据结构的实现
Jul 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与javascript对多项选择的处理
2006/10/09 PHP
php 搜索框提示(自动完成)实例代码
2012/02/05 PHP
php Session存储到Redis的方法
2013/11/04 PHP
PHP使用SOAP调用.net的WebService数据
2013/11/12 PHP
js获取url参数的使用扩展实例
2007/12/29 Javascript
select标记美化--JS式插件、后期加载
2013/04/01 Javascript
Javascript学习指南
2014/12/01 Javascript
jQuery插件Validate实现自定义校验结果样式
2016/01/18 Javascript
前端程序员必须知道的高性能Javascript知识
2016/08/24 Javascript
yarn与npm的命令行小结
2016/10/20 Javascript
js在ie下打开对话窗口的方法小结
2016/10/24 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
node.js用fs.rename强制重命名或移动文件夹的方法
2017/12/27 Javascript
微信小程序实现折叠与展开文章功能
2018/06/12 Javascript
浅谈Webpack打包优化技巧
2018/06/12 Javascript
详解如何在vue项目中使用layui框架及采坑
2019/05/05 Javascript
json 带斜杠时如何解析的实现
2019/08/12 Javascript
微信小程序wx.request的简单封装
2019/11/13 Javascript
vant 解决tab切换插件标题样式自定义的问题
2020/11/13 Javascript
Element el-button 按钮组件的使用详解
2021/02/01 Javascript
[02:43]DOTA2英雄基础教程 德鲁伊
2014/01/13 DOTA
python基础教程之基本内置数据类型介绍
2014/02/20 Python
python 线程的暂停, 恢复, 退出详解及实例
2016/12/06 Python
python requests 测试代理ip是否生效
2018/07/25 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
2018/09/17 Python
Python 监测文件是否更新的方法
2019/06/10 Python
python实现的生成word文档功能示例
2019/08/23 Python
利用matplotlib实现根据实时数据动态更新图形
2019/12/13 Python
Python reques接口测试框架实现代码
2020/07/28 Python
印度购买眼镜和太阳镜网站:Coolwinks
2018/09/26 全球购物
Turnbull & Asser官网:英国皇室御用的顶级定制衬衫
2019/01/31 全球购物
艺术爱好者的自我评价分享
2013/10/08 职场文书
元旦文艺汇演主持词
2014/03/26 职场文书
公司离职证明范本(汇总)
2014/09/10 职场文书
民事赔偿协议书
2014/11/02 职场文书
2016年安康杯竞赛活动总结
2016/04/05 职场文书