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中将阿拉伯数字转换成中文的实现代码
May 19 Python
Python中使用copy模块实现列表(list)拷贝
Apr 14 Python
Python实现爬取逐浪小说的方法
Jul 07 Python
Python2与python3中 for 循环语句基础与实例分析
Nov 20 Python
基于Python socket的端口扫描程序实例代码
Feb 09 Python
Python中协程用法代码详解
Feb 10 Python
python使用flask与js进行前后台交互的例子
Jul 19 Python
Python OpenCV调用摄像头检测人脸并截图
Aug 20 Python
python实现图片插入文字
Nov 26 Python
python小技巧——将变量保存在本地及读取
Nov 13 Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
Mar 03 Python
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
Apr 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防止跨域提交表单
2013/11/01 PHP
PHP中创建和验证哈希的简单方法实探
2015/07/06 PHP
PHP实现提取多维数组指定一列的方法总结
2019/12/04 PHP
javascript 程序库的比较(一)之DOM功能
2010/04/07 Javascript
基于Jquery的文字滚动跑马灯插件(一个页面多个滚动区)
2010/07/26 Javascript
js动态设置鼠标事件示例代码
2013/10/30 Javascript
javascript Event对象详解及使用示例
2013/11/22 Javascript
checkbox勾选判断代码分析
2014/06/11 Javascript
javascript实现倒计时并弹窗提示特效
2015/06/05 Javascript
indexedDB bootstrap angularjs之 MVC DOMO (应用示例)
2016/06/20 Javascript
JS 拦截全局ajax请求实例解析
2016/11/29 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
微信小程序滚动Tab实现左右可滑动切换
2017/08/17 Javascript
vue实现行列转换的一种方法
2019/08/06 Javascript
使用vue实现HTML页面生成图片的方法
2020/03/12 Javascript
js HTML DOM EventListener功能与用法实例分析
2020/04/27 Javascript
[04:44]显微镜下的DOTA2第二期——你所没有注意到的细节
2014/06/20 DOTA
跟老齐学Python之有容乃大的list(3)
2014/09/15 Python
为python设置socket代理的方法
2015/01/14 Python
深入理解python多进程编程
2016/06/12 Python
解决python2.7 查询mysql时出现中文乱码
2016/10/09 Python
python爬虫_自动获取seebug的poc实例
2017/08/05 Python
matlab中实现矩阵删除一行或一列的方法
2018/04/04 Python
Flask之flask-script模块使用
2018/07/26 Python
django fernet fields字段加密实践详解
2019/08/12 Python
TensorFlow打印输出tensor的值
2020/04/19 Python
Django数据统计功能count()的使用
2020/11/30 Python
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
德国足球商店:OUTFITTER
2019/05/06 全球购物
adidas泰国官网:adidas TH
2020/07/11 全球购物
eBay荷兰购物网站:eBay.nl
2020/06/26 全球购物
中学生校园广播稿
2014/01/16 职场文书
社团招新策划书
2014/02/04 职场文书
我们的节日中秋节活动总结
2015/03/23 职场文书
博士导师推荐信
2015/03/25 职场文书
使用php的mail()函数实现发送邮件功能
2021/06/03 PHP