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自动化测试实例解析
Sep 28 Python
详细探究Python中的字典容器
Apr 14 Python
Python实现单词拼写检查
Apr 25 Python
Python批量重命名同一文件夹下文件的方法
May 25 Python
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
Apr 10 Python
python实现Flappy Bird源码
Dec 24 Python
python 多线程串行和并行的实例
Feb 22 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
May 06 Python
django的聚合函数和aggregate、annotate方法使用详解
Jul 23 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
May 23 Python
详解Python模块化编程与装饰器
Jan 16 Python
Python游戏开发实例之graphics实现AI五子棋
Nov 01 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
ThinkPHP空模块和空操作详解
2014/06/30 PHP
destoon实现调用热门关键字的方法
2014/07/15 PHP
64位windows系统下安装Memcache缓存
2015/12/06 PHP
利用PHP自动生成印有用户信息的名片
2016/08/01 PHP
php操作路径的经典方法(必看篇)
2016/10/04 PHP
JavaScript库 开发规则
2009/01/31 Javascript
xheditor与validate插件冲突的解决方案
2010/04/15 Javascript
禁止选中文字兼容IE、Chrome、FF等
2013/09/04 Javascript
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
如何实现chrome浏览器关闭页面时弹出“确定要离开此面吗?”
2015/03/05 Javascript
JS实现定时自动关闭DIV层提示框的方法
2015/05/11 Javascript
在JSP中如何实现MD5加密的方法
2016/11/02 Javascript
Vue的MVVM实现方法
2017/08/16 Javascript
vue+axios新手实践实现登陆的示例代码
2018/06/06 Javascript
微信小程序踩坑记录之解决tabBar.list[3].selectedIconPath大小超过40kb
2018/07/04 Javascript
echarts大屏字体自适应的方法步骤
2019/07/12 Javascript
Python命令启动Web服务器实例详解
2017/02/23 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
2018/03/20 Python
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
python之拟合的实现
2019/07/19 Python
Django用户身份验证完成示例代码
2020/04/03 Python
基于python实现判断字符串是否数字算法
2020/07/10 Python
一篇文章带你搞定Ubuntu中打开Pycharm总是卡顿崩溃
2020/11/02 Python
Python创建文件夹与文件的快捷方法
2020/12/08 Python
python爬取2021猫眼票房字体加密实例
2021/02/19 Python
纯CSS3发光分享按钮的实现教程
2014/09/06 HTML / CSS
阿迪达斯丹麦官网:adidas丹麦
2016/10/01 全球购物
加拿大廉价机票预订网站:CheapOair.ca
2018/03/04 全球购物
合作协议书怎么写
2014/04/18 职场文书
小学一年级评语大全
2014/04/22 职场文书
供货协议书范本
2014/04/22 职场文书
农村党员对照检查材料
2014/09/24 职场文书
重阳节标语大全
2014/10/07 职场文书
满月酒邀请函
2015/01/30 职场文书
2016年感恩教师节活动总结
2016/04/01 职场文书
解析python中的jsonpath 提取器
2022/01/18 Python