python樹的雙親存儲(chǔ)結(jié)構(gòu)的實(shí)現(xiàn)示例
這種存儲(chǔ)結(jié)構(gòu)是一種順序存儲(chǔ)結(jié)構(gòu),采用元素形如“[結(jié)點(diǎn)值,雙親結(jié)點(diǎn)索引]”的列表表示。通常每個(gè)結(jié)點(diǎn)有唯一的索引(或者偽地址),根結(jié)點(diǎn)的索引為0,它沒(méi)有雙親結(jié)點(diǎn),其雙親結(jié)點(diǎn)的索引為-1。例如,所示的樹對(duì)應(yīng)的雙親存儲(chǔ)結(jié)構(gòu)如下:
樹的雙親存儲(chǔ)結(jié)構(gòu)
t=[["A",-1],["B",0],["C",0],["D",1],["E",1],["F",1],["G",4]]
在該存儲(chǔ)結(jié)構(gòu)t中,索引為i的結(jié)點(diǎn)是t[i],其中t[i][0]為結(jié)點(diǎn)值,t[i][1]為該結(jié)點(diǎn)的雙親結(jié)點(diǎn)的索引。
若一棵樹采用雙親在儲(chǔ)結(jié)構(gòu)存儲(chǔ),設(shè)計(jì)一個(gè)算法求指定索引是i的結(jié)點(diǎn)的層次。
解:用cnt 表示索引i的結(jié)點(diǎn)的層次(初始為1)。沿著雙親指針向上移動(dòng),當(dāng)沒(méi)有到達(dá)根結(jié)點(diǎn)時(shí)循環(huán):cnt 增1,i向上移動(dòng)一次。當(dāng)?shù)竭_(dá)根結(jié)點(diǎn)時(shí)cnt 恰好為原索引i結(jié)點(diǎn)的層次,最后返回cnt。對(duì)應(yīng)的算法如下:
def find_level(parent, i): cnt = 1 while parent[i] != -1: cnt += 1 i = parent[i] return cnt
python樹的雙親存儲(chǔ)結(jié)構(gòu):
class FNode(): def __init__(self,name=None,i=None):#name為數(shù)據(jù),i為其對(duì)應(yīng)的父節(jié)點(diǎn)下標(biāo) self.node=[name,i] class ftree():#存儲(chǔ)節(jié)點(diǎn)數(shù)據(jù) def __init__(self): self.data=[] #增加 def add(self,name,i):#添加節(jié)點(diǎn)數(shù)據(jù)進(jìn)入數(shù)的結(jié)構(gòu) p = FNode(name,i)#建立節(jié)點(diǎn) self.data.append(p.node)#添加進(jìn)入 #創(chuàng)建 def CreateTree(self,arr):#傳入對(duì)應(yīng)數(shù)據(jù)建立數(shù)arr為一個(gè)樹關(guān)系的二維列表 for i in arr: self.data.append(i) #刪除 def Dex(self,name,i):#給出節(jié)點(diǎn)的name和i進(jìn)行刪除 for j in range(len(self.data)): if self.data[j][0]==name and self.data[j][1]==i: self.data.pop(j) break # 修改節(jié)點(diǎn)數(shù)據(jù) def alter(self,name,i,n_name): for j in range(len(self.data)): if self.data[j][0]==name and self.data[j][1]==i: self.data[j][0]=n_name break #查找節(jié)點(diǎn) def find(self,name,i): for j in range(len(self.data)): if self.data[j][0]==name and self.data[j][1]==i: return self.data[j] #遍歷樹結(jié)構(gòu),雙親存儲(chǔ)單位的結(jié)構(gòu)決定了它只能層次遍歷 def display(self): for i in range(len(self.data)): print(self.data[i][0],end=" ") print() t = [['A',-1],['B',0],['C',0],['D',1],['E',1],['F',1],['G',4]] tree_1 = ftree() tree_1.CreateTree(t) tree_1.display() tree_1.add('H',4) tree_1.display() tree_1.Dex('H',4) tree_1.display() tree_1.alter('G',4,'5') tree_1.display() print(tree_1.find('A',-1))
雙親存儲(chǔ)結(jié)構(gòu)利用了每個(gè)結(jié)點(diǎn)(根節(jié)點(diǎn)除外)有啡一雙親的性質(zhì)。在這種存儲(chǔ)結(jié)構(gòu)中,求某個(gè)結(jié)點(diǎn)的雙親結(jié)點(diǎn)十分容易,但求某個(gè)結(jié)點(diǎn)的孩子結(jié)點(diǎn)時(shí)需要遍歷整個(gè)結(jié)構(gòu)。
到此這篇關(guān)于python樹的雙親存儲(chǔ)結(jié)構(gòu)的文章就介紹到這了,更多相關(guān)python樹的雙親存儲(chǔ)結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python基本算法之實(shí)現(xiàn)歸并排序(Merge sort)
這篇文章主要給大家介紹了關(guān)于python基本算法之實(shí)現(xiàn)歸并排序(Merge sort)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Python基于matplotlib畫箱體圖檢驗(yàn)異常值操作示例【附xls數(shù)據(jù)文件下載】
這篇文章主要介紹了Python基于matplotlib畫箱體圖檢驗(yàn)異常值操作,涉及Python針對(duì)xls格式數(shù)據(jù)文件的讀取、matplotlib圖形繪制等相關(guān)操作技巧,并附帶xls數(shù)據(jù)文件供讀者下載參考,需要的朋友可以參考下2019-01-01Python列表推導(dǎo)式,元組推導(dǎo)式,字典推導(dǎo)式,集合推導(dǎo)式
這篇文章主要介紹了Python列表推導(dǎo)式,元組推導(dǎo)式,字典推導(dǎo)式,集合推導(dǎo)式,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-09-09Python類和對(duì)象的定義與實(shí)際應(yīng)用案例分析
這篇文章主要介紹了Python類和對(duì)象的定義與實(shí)際應(yīng)用,結(jié)合三個(gè)具體案例形式分析了Python面向?qū)ο蟪绦蛟O(shè)計(jì)中類與對(duì)象的定義、應(yīng)用、設(shè)計(jì)模式等相關(guān)操作技巧,需要的朋友可以參考下2018-12-12Python實(shí)現(xiàn)代碼統(tǒng)計(jì)工具(終極篇)
這篇文章主要介紹了Python實(shí)現(xiàn)代碼統(tǒng)計(jì)工具的相關(guān)資料,供大家參考,感興趣的小伙伴們可以參考一下2016-07-07python讀取圖片的幾種方式及圖像寬和高的存儲(chǔ)順序
這篇文章主要介紹了python讀取圖片的幾種方式及圖像寬和高的存儲(chǔ)順序,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02python向量化與for循環(huán)耗時(shí)對(duì)比分析
這篇文章主要介紹了python向量化與for循環(huán)耗時(shí)對(duì)比分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05