python树的双亲存储结构

...........................................................................................................................................................

这种存储结构是一种顺序存储结构,采用元素形如“[结点值,双亲结点索引]”的列表表示。通常每个结点有唯一的索引(或者伪地址),根结点的索引为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]为该结点的双亲结点的索引。

python树的双亲存储结构_第1张图片

若一棵树采用双亲在储结构存储,设计一个算法求指定索引是i的结点的层次。
解:用cnt 表示索引i的结点的层次(初始为1)。沿着双亲指针向上移动,当没有到达根结点时循环:cnt 增1,i向上移动一次。当到达根结点时cnt 恰好为原索引i结点的层次,最后返回cnt。对应的算法如下:

...........................................................................................................................................................


```python
def find_level(parent, i):
    cnt = 1
    while parent[i] != -1:
        cnt += 1
        i = 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_name
                break
    #查找节点
    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))

.......................................................................................................................................................... 

双亲存储结构利用了每个结点(根节点除外)有啡一双亲的性质。在这种存储结构
中,求某个结点的双亲结点十分容易,但求某个结点的孩子结点时需要遍历整个结构。

.......................................................................................................................................................... 

Guff_hys_python数据结构,大数据开发学习,python实训项目-CSDN博客

.......................................................................................................................................................... 

你可能感兴趣的:(python,java,前端,算法,数据结构,学习,开发语言)