這種存儲結構是一種順序存儲結構,采用元素形如“[結點值,雙親結點索引]”的列表表示。通常每個結點有唯一的索引(或者偽地址),根結點的索引為0,它沒有雙親結點,其雙親結點的索引為-1。例如,所示的樹對應的雙親存儲結構如下:
#樹的雙親存儲結構
t=[["A",-1],["B",0],["C",0],["D",1],["E",1],["F",1],["G",4]] |
在該存儲結構t中,索引為i的結點是t[i],其中t[i][0]為結點值,t[i][1]為該結點的雙親結點的索引。
若一棵樹采用雙親在儲結構存儲,設計一個算法求指定索引是i的結點的層次。
解:用cnt?表示索引i的結點的層次(初始為1)。沿著雙親指針向上移動,當沒有到達根結點時循環:cnt?增1,i向上移動一次。當到達根結點時cnt?恰好為原索引i結點的層次,最后返回cnt。對應的算法如下:
```python
def find_level(parent, i):cnt = 1while parent[i] != -1:cnt += 1i = parent[i]return cnt
```
?python樹的雙親存儲結構:
class FNode():def __init__(self,name=None,i=None):#name為數據,i為其對應的父節點下標self.node=[name,i]
class ftree():#存儲節點數據def __init__(self):self.data=[]#增加def add(self,name,i):#添加節點數據進入數的結構p = FNode(name,i)#建立節點self.data.append(p.node)#添加進入#創建def CreateTree(self,arr):#傳入對應數據建立數arr為一個樹關系的二維列表for i in arr:self.data.append(i)#刪除def Dex(self,name,i):#給出節點的name和i進行刪除for j in range(len(self.data)):if self.data[j][0]==name and self.data[j][1]==i:self.data.pop(j)break# 修改節點數據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_namebreak#查找節點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]#遍歷樹結構,雙親存儲單位的結構決定了它只能層次遍歷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))
雙親存儲結構利用了每個結點(根節點除外)有啡一雙親的性質。在這種存儲結構
中,求某個結點的雙親結點十分容易,但求某個結點的孩子結點時需要遍歷整個結構。