欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python二叉樹的定義及常用遍歷算法分析

 更新時間:2017年11月24日 12:02:13   作者:caochao  
這篇文章主要介紹了Python二叉樹的定義及常用遍歷算法,結(jié)合實例形式分析了基于Python的二叉樹定義與先序、中序、后序、層序等遍歷方法,需要的朋友可以參考下

本文實例講述了Python二叉樹的定義及常用遍歷算法。分享給大家供大家參考,具體如下:

說起二叉樹的遍歷,大學(xué)里講的是遞歸算法,大多數(shù)人首先想到也是遞歸算法。但作為一個有理想有追求的程序員。也應(yīng)該學(xué)學(xué)非遞歸算法實現(xiàn)二叉樹遍歷。二叉樹的非遞歸算法需要用到輔助棧,算法著實巧妙,令人腦洞大開。

以下直入主題:

定義一顆二叉樹,請看官自行想象其形狀,

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

后序遍歷:

后序遍歷中,要保證左孩子和右孩子都已被訪問才能訪問根結(jié)點,并且左孩子需在右孩子前訪問,這就為流程的控制帶來了難題。下面介紹兩種思路。

思路一,雙棧法,這種方式比較容易理解,缺點是需要兩個棧。

'''
后序遍歷二叉樹
'''
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() )

思路二,要保證根結(jié)點在左孩子和右孩子訪問之后才能訪問,因此對于任一結(jié)點P,先將其入棧。如果P不存在左孩子和右孩子,則可以直接訪問它;或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被訪問過了,則同樣可以直接訪問該結(jié)點。若非上述兩種情況,則將P的右孩子和左孩子依次入棧,這樣就保證了每次取棧頂元素的時候,左孩子在右孩子前面被訪問,左孩子和右孩子都在根結(jié)點前面被訪問。

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 )

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python加密解密算法與技巧總結(jié)》、《Python編碼操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進階經(jīng)典教程

希望本文所述對大家Python程序設(shè)計有所幫助。

相關(guān)文章

  • Python中使用Lambda函數(shù)的5種用法

    Python中使用Lambda函數(shù)的5種用法

    這篇文章主要介紹了Python中使用Lambda函數(shù)的5種用法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 總結(jié)python實現(xiàn)父類調(diào)用兩種方法的不同

    總結(jié)python實現(xiàn)父類調(diào)用兩種方法的不同

    最近在工作中實現(xiàn)父類調(diào)用的時候發(fā)現(xiàn)了一個錯誤,然后通過分析實踐總結(jié)出來了,下面這篇文章主要給大家總結(jié)了python中實現(xiàn)父類調(diào)用兩種方法的不同之處,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • python處理大日志文件

    python處理大日志文件

    這篇文章主要為大家詳細(xì)介紹了python處理大日志文件的的相關(guān)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Python函數(shù)式編程

    Python函數(shù)式編程

    函數(shù)式編程Functional Programming,雖然也可以歸結(jié)到面向過程的程序設(shè)計,但其思想更接近數(shù)學(xué)計算。函數(shù)式編程就是一種抽象程度很高的編程范式,純粹的函數(shù)式編程語言編寫的函數(shù)沒有變量。
    2017-07-07
  • Python如何讀取csv文件時添加表頭/列名

    Python如何讀取csv文件時添加表頭/列名

    這篇文章主要介紹了Python如何讀取csv文件時添加表頭/列名,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 詳解Python中下劃線的5種含義

    詳解Python中下劃線的5種含義

    本文介紹了Python中單下劃線和雙下劃線的各種含義和命名約定,名稱修飾的工作原理,以及它如何影響你自己的Python類,感興趣的可以了解一下
    2021-07-07
  • python pillow模塊使用方法詳解

    python pillow模塊使用方法詳解

    這篇文章主要介紹了python pillow模塊使用方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • Python json 錯誤xx is not JSON serializable解決辦法

    Python json 錯誤xx is not JSON serializable解決辦法

    這篇文章主要介紹了Python json 錯誤xx is not JSON serializable解決辦法的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • pycharm新建一個python工程步驟

    pycharm新建一個python工程步驟

    在本文里小編給讀者們分享一篇關(guān)于pycharm怎么新建一個python工程的知識點和步驟內(nèi)容,需要的朋友們學(xué)習(xí)下。
    2019-07-07
  • Python 類與元類的深度挖掘 I【經(jīng)驗】

    Python 類與元類的深度挖掘 I【經(jīng)驗】

    super() 方法解決了類->實例實踐過程中關(guān)于命名空間的一些問題,而關(guān)于生成對象的流程,我們知道初始化實例是通過類的 __init__() 方法完成的,在此之前可能涉及到一些其它的準(zhǔn)備工作,包括接下來提到的 mro() 方法以及關(guān)鍵的元類->類的過程
    2016-05-05

最新評論