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的Cookie.py模块支持冒号做key的方法
Dec 28 Python
用Python的Django框架来制作一个RSS阅读器
Jul 22 Python
python用模块zlib压缩与解压字符串和文件的方法
Dec 16 Python
python脚本监控Tomcat服务器的方法
Jul 06 Python
详解Python3中ceil()函数用法
Feb 19 Python
python读取mysql数据绘制条形图
Mar 25 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
Apr 02 Python
Python 改变数组类型为uint8的实现
Apr 09 Python
使用Python内置模块与函数进行不同进制的数的转换
Apr 26 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
May 22 Python
Python利用folium实现地图可视化
May 23 Python
Python 数据可视化之Matplotlib详解
Nov 02 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的cms
2010/12/19 PHP
php添加文章时生成静态HTML文章的实现代码
2013/02/17 PHP
php下载excel无法打开的解决方法
2013/12/24 PHP
php自定义函数截取汉字长度
2014/05/15 PHP
php通过递归方式复制目录和子目录的方法
2015/03/13 PHP
php网页版聊天软件实现代码
2016/08/12 PHP
php的优点总结 php有哪些优点
2019/07/19 PHP
解决laravel groupBy 对查询结果进行分组出现的问题
2019/10/09 PHP
PHP date_default_timezone_set()设置时区操作实例分析
2020/05/16 PHP
innerHTML,outerHTML,innerTEXT三者之间的区别
2007/01/28 Javascript
用Javascript实现锚点(Anchor)间平滑跳转
2009/09/08 Javascript
漂亮的jquery提示效果(仿腾讯弹出层)
2013/02/05 Javascript
javascript将中国数字格式转换成欧式数字格式的简单实例
2016/08/02 Javascript
模拟javascript中的sort排序(简单实例)
2016/08/17 Javascript
jquery日历插件e-calendar升级版
2016/11/10 Javascript
纯js实现倒计时功能
2017/01/06 Javascript
js实现九宫格拼图小游戏
2017/02/13 Javascript
jQuery插件HighCharts实现的2D堆条状图效果示例【附demo源码下载】
2017/03/14 Javascript
JS 插件dropload下拉刷新、上拉加载使用小结
2017/04/13 Javascript
jQuery鼠标移动图片上实现放大效果
2017/06/25 jQuery
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
React-Native左右联动List的示例代码
2017/09/21 Javascript
jQuery实现的粘性滚动导航栏效果实例【附源码下载】
2017/10/19 jQuery
Javascript之高级数组API的使用实例
2019/03/08 Javascript
python抓取某汽车网数据解析html存入excel示例
2013/12/04 Python
详解Python中 sys.argv[]的用法简明解释
2017/12/20 Python
python 实现将多条曲线画在一幅图上的方法
2019/07/07 Python
css3中less实现文字长阴影(long shadow)
2020/04/24 HTML / CSS
HOTEL INFO英国:搜索全球酒店
2019/08/08 全球购物
意大利一家专营包包和配饰的网上商店:Borse Last Minute
2019/08/26 全球购物
利物浦足球俱乐部官方商店(美国):Liverpool FC US
2019/10/09 全球购物
喝酒检查书范文
2014/02/23 职场文书
员工生日会策划方案
2014/06/14 职场文书
大专生自我鉴定怎么写
2014/09/16 职场文书
玄武湖导游词
2015/02/05 职场文书
想创业成功,需要掌握这些要点
2019/12/06 职场文书