




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第python二叉樹類以及其4種遍歷方法實(shí)例目錄前言實(shí)例代碼:相關(guān)閱讀內(nèi)容:總結(jié)
前言
之前學(xué)習(xí)過(guò)binarytree第三方庫(kù),了解了它定義的各種基本用法。
昨天在問(wèn)答頻道中做題時(shí)碰到一個(gè)關(guān)于二叉樹的算法填空題,感覺(jué)代碼不錯(cuò)非常值得學(xué)習(xí),于是整理代碼分享如下:
實(shí)例代碼:
fromcollectionsimportdeque#層遍歷中用到隊(duì)列數(shù)據(jù)類型
classBTNode:#二叉鏈中結(jié)點(diǎn)類
def__init__(self,d=None):
self.data=d#結(jié)點(diǎn)值
self.lchild=None#左hai子指針
self.rchild=None#右hai子指針
classBTree:#二叉樹類
def__init__(self,d=None):
self.b=None#根結(jié)點(diǎn)指針
defDispBTree(self):#返回二叉鏈的括號(hào)表示串
returnself._DispBTree1(self.b)
def_DispBTree1(self,t):#被DispBTree方法調(diào)用
ift==None:#空樹返回空串
return""
else:
bstr=t.data#輸出根結(jié)點(diǎn)值
ift.lchild!=Noneort.rchild!=None:
bstr+="("#有hai子結(jié)點(diǎn)時(shí)輸出"("
bstr+=self._DispBTree1(t.lchild)#遞歸輸出左子樹
ift.rchild!=None:
bstr+=","#有右hai子結(jié)點(diǎn)時(shí)輸出","
bstr+=self._DispBTree1(t.rchild)#遞歸輸出右子樹
bstr+=")"#輸出")"
returnbstr
defFindNode(self,x):#查找值為x的結(jié)點(diǎn)算法
returnself._FindNode1(self.b,x)
def_FindNode1(self,t,x):#被FindNode方法調(diào)用
ift==None:
returnNone#t為空時(shí)返回null
elift.data==x:
returnt#t所指結(jié)點(diǎn)值為x時(shí)返回t
else:
p=self._FindNode1(t.lchild,x)#在左子樹中查找
ifp!=None:
returnp#在左子樹中找到p結(jié)點(diǎn),返回p
else:
returnself._FindNode1(t.rchild,x)#返回在右子樹中查找結(jié)果
defHeight(self):#求二叉樹高度的算法
returnself._Height1(self.b)
def_Height1(self,t):#被Height方法調(diào)用
ift==None:
return0#空樹的高度為0
else:
lh=self._Height1(t.lchild)#求左子樹高度lchildh
rh=self._Height1(t.rchild)#求右子樹高度rchildh
returnmax(lh,rh)+1
defPreOrder(bt):#先序遍歷的遞歸算法
_PreOrder(bt.b)
def_PreOrder(t):#被PreOrder方法調(diào)用
ift!=None:
print(t.data,end='')#訪問(wèn)根結(jié)點(diǎn)
_PreOrder(t.lchild)#先序遍歷左子樹
_PreOrder(t.rchild)#先序遍歷右子樹
defInOrder(bt):#中序遍歷的遞歸算法
_InOrder(bt.b)
def_InOrder(t):#被InOrder方法調(diào)用
ift!=None:
_InOrder(t.lchild)#中序遍歷左子樹
print(t.data,end='')#訪問(wèn)根結(jié)點(diǎn)
_InOrder(t.rchild)#中序遍歷右子樹
defPostOrder(bt):#后序遍歷的遞歸算法
_PostOrder(bt.b)
def_PostOrder(t):#被PostOrder方法調(diào)用
ift!=None:
_PostOrder(t.lchild)#后序遍歷左子樹
_PostOrder(t.rchild)#后序遍歷右子樹
print(t.data,end='')#訪問(wèn)根結(jié)點(diǎn)
defLevelOrder(bt):#層序遍歷的算法
qu=deque()#將雙端隊(duì)列作為普通隊(duì)列qu
qu.append(bt.b)#根結(jié)點(diǎn)進(jìn)隊(duì)
whilelen(qu)0:#隊(duì)不空循環(huán)
p=qu.popleft()#出隊(duì)一個(gè)結(jié)點(diǎn)
print(p.data,end='')#訪問(wèn)p結(jié)點(diǎn)
ifp.lchild!=None:#有左hai子時(shí)將其進(jìn)隊(duì)
qu.append(p.lchild)
ifp.rchild!=None:#有右hai子時(shí)將其進(jìn)隊(duì)
qu.append(p.rchild)
defCreateBTree2(posts,ins):#由后序序列posts和中序序列ins構(gòu)造二叉鏈
bt=BTree()
bt.b=_CreateBTree2(posts,0,ins,0,len(posts))
returnbt
def_CreateBTree2(posts,i,ins,j,n):
ifn=0:
returnNone
d=posts[i+n-1]#取后序序列尾元素d
t=BTNode(d)#創(chuàng)建根結(jié)點(diǎn)(結(jié)點(diǎn)值為d)
p=ins.index(d)#在ins中找到根結(jié)點(diǎn)的索引
k=p-j#確定左子樹中結(jié)點(diǎn)個(gè)數(shù)k
t.lchild=_CreateBTree2(posts,i,ins,j,k)#遞歸構(gòu)造左子樹
t.rchild=_CreateBTree2(posts,i+k,ins,p+1,n-k-1)#遞歸構(gòu)造右子樹
returnt
if__name__=='__main__':
inlst=['D','G','B','A','E','C','F']
posts=['G','D','B','E','F','C','A']
print(f"中序列表:{inlst}")
print(f"后序列表:{posts}")
#構(gòu)造二叉樹bt
bt=BTree()
bt=CreateBTree2(posts,inlst)
print(f"\n構(gòu)造二叉樹:{bt.DispBTree()}")
x='F'
ifbt.FindNode(x):
print(f"bt中存在:'{x}'")
else:
print(f"bt中不存在:'{x}'")
print(f"bt的高度:{bt.Height():^3}")
print("\n先序遍歷:",end='')
PreOrder(bt)
print("\n中序遍歷列:",end='')
InOrder(bt)
print("\n后序遍歷:",end='')
PostOrder(bt)
print("\n層序遍歷:",end='')
LevelOrder(bt)
中序列表:[D,G,B,A,E,C,F]
后序列表:[G,D,B,E,F,C,A]
構(gòu)造二叉樹:A(B(D(,G),C(E,F))
bt中存在:F
bt的高度:4
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年凈水絮凝劑項(xiàng)目項(xiàng)目投資需求報(bào)告代可行性研究報(bào)告
- 萍鄉(xiāng)市人才檔案管理辦法
- 蒲城縣建筑項(xiàng)目管理辦法
- 蚌埠公司公積金管理辦法
- 行政審批局專家管理辦法
- 西安市夏季犬種管理辦法
- 衢州市犬類管理暫行辦法
- 西湖區(qū)小區(qū)門禁管理辦法
- 許昌市學(xué)校食堂管理辦法
- 評(píng)審費(fèi)收費(fèi)管理暫行辦法
- 工程材料耗用(核算)表
- 貴州飛賽貿(mào)易有限公司6萬(wàn)噸年殘陽(yáng)極碳?jí)K加工項(xiàng)目環(huán)評(píng)報(bào)告
- 普通螺栓理論重量表
- 關(guān)于成立特種設(shè)備安全管理機(jī)構(gòu)的通知(模板)
- 全國(guó)廣播電視技術(shù)能手調(diào)頻與電視廣播組題庫(kù)
- 六西格瑪(6Sigma)詳解及實(shí)際案例分析
- 初中物理課程標(biāo)準(zhǔn)(2022版)測(cè)試題庫(kù)附答案(物理新課程標(biāo)準(zhǔn)試題教師資格考試教師招聘考試試卷)
- 小學(xué)四年級(jí)下冊(cè)《科學(xué)》期末考試質(zhì)量分析
- 婦產(chǎn)科手術(shù)分級(jí)目錄
- 埃得新材料有限公司年產(chǎn)10425噸聚苯醚及5000噸鄰甲酚項(xiàng)目環(huán)境影響報(bào)告書
- 2017版銀皮書(中英文完整版)FIDIC設(shè)計(jì)采購(gòu)施工交鑰匙項(xiàng)目合同條件
評(píng)論
0/150
提交評(píng)論