最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python 二叉樹的層序建立與三種遍歷實現詳解

 更新時間:2019年07月29日 09:17:33   作者:TomHawk  
這篇文章主要介紹了Python 二叉樹的層序建立與三種遍歷實現詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

前言

二叉樹(Binary Tree)時數據結構中一個非常重要的結構,其具有。。。。(此處省略好多字)。。。。等的優(yōu)良特點。

之前在刷LeetCode的時候把有關樹的題目全部跳過了,(ORZ:我這種連數據結構都不會的人刷j8Leetcode?。。。。?/p>

所以 ?。?!敲黑板了?。?!今天我就在B站看了數據結構中關于樹的內容后,又用我淺薄的Python大法來實現一些樹的建立和遍歷。

關于樹的建立我覺得層序建立對于使用者來說最為直觀,輸入很好寫。(好吧,我是看LeetCode中的樹輸入都是采用層序輸入覺得非常好)

樹節(jié)點定義

代碼來

class BSTreeNode(object):
 def __init__(self, data):
  self.val = data
  self.leftChild = None
  self.rightChild = None

這一段代碼太好理解了好吧,就不BB了。

二叉樹層序建立

不多說,先上代碼

# 建立二叉樹是以層序遍歷方式輸入,節(jié)點不存在時以 'None' 表示
def creatTree(nodeList):
 if nodeList[0] == None:
  return None
 head = BSTreeNode(nodeList[0])
 Nodes = [head]
 j = 1
 for node in Nodes:
  if node != None:
   node.leftChild = (BSTreeNode(nodeList[j]) if nodeList[j] != None else None)
   Nodes.append(node.leftChild)
   j += 1
   if j == len(nodeList):
    return head
   node.rightChild = (BSTreeNode(nodeList[j])if nodeList[j] != None else None)
   j += 1
   Nodes.append(node.rightChild)
   if j == len(nodeList):
    return head

creatTree即為層序建立二叉樹的函數,傳入的參數為一個層序遍歷的數組,就是將樹節(jié)點從左往右,從上往下一次放入數組中,如果某個節(jié)點不存在則用None來表示。

比如:

圖所示的二叉樹則需輸入a = [1,2,3,4,5,None,6,None,None,7,8],接下來將會以這個二叉樹為例講解代碼。

  • 第3-4行,判斷根節(jié)點是否為空。 如果根節(jié)點都為空,那樹(shuo)就(ge)不(j)存(8)在了,直接返回就好了。
  • 第5行,將元素列表中的第一個元素取出新建根節(jié)點,最后返回的即為根節(jié)點
  • 第6行,創(chuàng)建了一個Nodes列表中,用于存放樹中的節(jié)點,每生成一個節(jié)點就將其放入該列表中,可以看成是一個隊列(這么說好像也不是特別規(guī)范,因為后面只是取列表中的元素,沒有彈出首元素),此處將根節(jié)點存入。
  • 第7行,創(chuàng)建變量j用于nodeList中元素的索引,初始為1.因為第0個元素已經創(chuàng)建根節(jié)點了。
  • 第8行,依次取出Nodes列表中的節(jié)點,對其創(chuàng)建左子節(jié)點和右子節(jié)點
  • 第9行,首先判斷取出的Nodes是否為空,如果為空,說明此處沒有節(jié)點,就無需創(chuàng)建子節(jié)點,否則進行子節(jié)點的創(chuàng)建
  • 第10行,為該節(jié)點創(chuàng)建左節(jié)點,其值就是索引j的所對應的值,如果nodeLists[j] == None 說明沒有該子節(jié)點,就不用創(chuàng)建了,即Child = None
  • 第11行,將新建的節(jié)點加入Nodes數組,使其在for循環(huán)中可以繼續(xù)為其添加子節(jié)點
  • 第12行,j加1,這樣剛好使每一個nodeList的元素對應一個節(jié)點了
  • 第13行,判斷j的值,如果與nodeList值相等說明全部節(jié)點已經添加完畢了,直接返回head根節(jié)點就完成了樹的建立
  • 第15-19行,為節(jié)點添加右節(jié)點,與添加左節(jié)點的邏輯是一樣的,就不在贅述了

好了代碼注釋完畢,我們再通過結合實例來解釋一下:

  • nodeList = [1,2,3,4,5,None,6,None,None,7,8],下面節(jié)點統(tǒng)一用n(值)來表示
  • 建立根節(jié)點 head = n(1), j=1, len(nodeList) = 11
  • 開始for循環(huán):Nodes = [n(1)]
    • node為n(1),非空
      • nodeList[j]=nodeList[1]=2 非空,所以新建節(jié)點n(2),n(1)的左節(jié)點即為n(2),新建節(jié)點放入Nodes, 則Nodes=[n(1),n(2)] j+1=2, j未溢出
      • nodeList[j]=nodeList[2]=3 非空,所以新建節(jié)點n(3),n(1)的右節(jié)點即為n(3),新建節(jié)點放入Nodes, 則Nodes=[n(1),n(2),n(3)], 然后j+1=3, j未溢出
    • node為n(2),非空
      • nodeList[j]=nodeList[3]=4 非空,所以新建節(jié)點n(4),n(2)的左節(jié)點即為n(4),新建節(jié)點放入Nodes, 則Nodes=[n(1),n(2),n(3),n(4)], j+1=4, j未溢出
      • nodeList[j]=nodeList[4]=5 非空,所以新建節(jié)點n(5),n(2)的右節(jié)點即為n(5),新建節(jié)點放入Nodes, 則Nodes=[n(1),n(2),n(3),n(4),n(5)], j+1=5, j未溢出
    • node為n(3),非空
      • nodeList[j]=nodeList[5]=None 為空,所以n(3)的左節(jié)點直接等于None, 同時將None也放入Nodes, 則Nodes=[n(1),n(2),n(3),n(4),n(5),None] j+1=6, j未溢出
      • nodeList[j]=nodeList[6]=6 非空,所以新建節(jié)點n(6),n(3)的右節(jié)點即為n(6),新建節(jié)點放入Nodes, 則Nodes=[n(1),n(2),n(3),n(4),n(5),None,n(6)], j+1=7, j未溢出 
    • node為n(4),非空
      • nodeList[j]=nodeList[7]=None 為空,所以n(4)的左節(jié)點直接等于None,同時將None也放入Nodes, 則Nodes=[n(1),n(2),n(3),n(4),n(5),None,n(6),None], j+1=8, j未溢出
      • nodeList[j]=nodeList[8]=None 為空,所以n(4)的右節(jié)點直接等于None,同時將None也放入Nodes, 則Nodes=[n(1),n(2),n(3),n(4),n(5),None,n(6),None,None], j+1=9, j未溢出
    • node為n(5), 非空
      • nodeList[j]=nodeList[9]=7 非空,所以新建節(jié)點n(7),n(5)的左節(jié)點即為n(7),新建節(jié)點放入Nodes, 則Nodes=[n(1),n(2),n(3),n(4),n(5),None,n(6),None,None,n(9)] j+1=10, j未溢出
      • nodeList[j]=nodeList[10]=8 非空,所以新建節(jié)點n(8),n(5)的右節(jié)點即為n(8),新建節(jié)點放入Nodes, 則Nodes=[n(1),n(2),n(3),n(4),n(5),None,n(6),None,None,n(9),n(10)] j+1=11, j溢出
  • j溢出,則返回head根節(jié)點,結束二叉樹的建立

PS:如果node為空節(jié)點的話,就會直接跳過空節(jié)點。

二叉樹遍歷(神用的遞歸)

1. 前序遍歷

#head為二叉樹的根節(jié)點
def PreorderTraverse(head):
 if head:
  print(head.val)
  PreorderTraverse(head.leftChild)
  PreorderTraverse(head.rightChild)

2. 中序遍歷

#head為二叉樹的根節(jié)點
def InorderTrverse(head):
 if head:
  InorderTrverse(head.leftChild)
  print(head.val)
  InorderTrverse(head.rightChild)

3. 后續(xù)遍歷

#head為二叉樹的根節(jié)點
def PostorderTraverse(head):
 if head:
  PostorderTraverse(head.leftChild)
  PostorderTraverse(head.rightChild)
  print(head.val)

對中序遍歷,費了我九牛二虎之力畫了一個程序執(zhí)行的圖,紅色箭頭代表程序執(zhí)行的過程,依然以a = [1,2,3,4,5,None,6,None,None,7,8]為例

這個圖看上去不是很清楚,右鍵保存到本地看會清楚很多的,我把每一步遞歸的樹都畫出來了,這樣更加方便理解。

所以程序打印出來的順序為:4 2 7 5 8 1 3 6

最后,致敬大佬,祝各位學有所成。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • python中self原理實例分析

    python中self原理實例分析

    這篇文章主要介紹了python中self原理,較為詳細的分析了self的原理與相關的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • Python?異步等待任務集合

    Python?異步等待任務集合

    這篇文章主要為大家介紹了Python?異步等待任務集合,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • pygame實現滑塊接小球游戲

    pygame實現滑塊接小球游戲

    這篇文章主要為大家詳細介紹了pygame實現滑塊接小球游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Python 檢查數組元素是否存在類似PHP isset()方法

    Python 檢查數組元素是否存在類似PHP isset()方法

    isset方法來檢查數組元素是否存在,在Python中無對應函數,在Python中一般可以通過異常來處理數組元素不存在的情況,而無須事先檢查
    2014-10-10
  • Python編程新標準學會十項好習慣提升編碼質量

    Python編程新標準學會十項好習慣提升編碼質量

    這篇文章主要為大家介紹了Python編程新標準學會十項好習慣提升編碼質量,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • 關于adfuller函數返回值的參數說明與記錄

    關于adfuller函數返回值的參數說明與記錄

    這篇文章主要介紹了關于adfuller函數返回值的參數說明與記錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 在Pytorch中簡單使用tensorboard

    在Pytorch中簡單使用tensorboard

    今天給大家?guī)淼氖顷P于Python的相關知識,文章圍繞著Pytorch使用tensorboard展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Python爬蟲框架Scrapy實戰(zhàn)之批量抓取招聘信息

    Python爬蟲框架Scrapy實戰(zhàn)之批量抓取招聘信息

    網絡爬蟲又被稱為網頁蜘蛛,網絡機器人,在FOAF社區(qū)中間,更經常的稱為網頁追逐者,是按照一定的規(guī)則,自動抓取萬維網信息的程序或者腳本。這篇文章主要介紹Python爬蟲框架Scrapy實戰(zhàn)之批量抓取招聘信息,有需要的朋友可以參考下
    2015-08-08
  • matplotlib 縱坐標軸顯示數據值的實例

    matplotlib 縱坐標軸顯示數據值的實例

    今天小編就為大家分享一篇matplotlib 縱坐標軸顯示數據值的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 使用pygame模塊編寫貪吃蛇的實例講解

    使用pygame模塊編寫貪吃蛇的實例講解

    下面小編就為大家分享一篇使用pygame模塊編寫貪吃蛇的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02

最新評論

桃江县| 临清市| 方正县| 炎陵县| 育儿| 拜城县| 集贤县| 湾仔区| 扶余县| 永吉县| 页游| 乌苏市| 聂拉木县| 南投县| 莎车县| 灌云县| 丘北县| 宁远县| 故城县| 新民市| 常宁市| 从江县| 讷河市| 南召县| 千阳县| 永泰县| 绥阳县| 清原| 西青区| 虞城县| 龙岩市| 金门县| 奉贤区| 兴安县| 泉州市| 江北区| 连山| 揭西县| 富阳市| 永靖县| 抚顺县|