长子兄弟链存储结构(孩子兄弟链存储结构)解释:
长子兄弟链存储结构是一种树的存储结构,它使用孩子兄弟表示法(也称作左孩子右兄弟表示法)来表示树的结构。这种表示方法主要用于存储一般的树,而不是二叉树。
在长子兄弟链存储结构中,树中的每个节点都有两个指针:一个指向它的第一个孩子节点,另一个指向它的右边(兄弟)的节点。这种表示方法使用了类似链表的结构,使得树的每个节点可以灵活地连接到它的子节点和兄弟节点。
使用长子兄弟链存储结构,可以有效地表示任意形状的树,而且在进行树的遍历和操作时也相对容易。这种存储结构的主要优点是节省空间,因为不需要额外的指针来表示左右子树,同时也便于实现树的各种操作,如插入、删除和查找等。长子兄弟链存储结构在树的应用中具有一定的灵活性和效率。
代码:
class BENode():
def __init__(self,data,son=None,brother=None):
self.data=data
self.son=son
self.brother=brother
class BEStree():
def __init__(self):
self.data=[]
# 建立根节点,并存储在self.data中
def create_t(self,e):
a = BENode(e)
self.data.append(a)
# 建立节点与节点之间关系,并存储在self.data中,brother的存储优先级<son的存储优先级(增加节点)
def create_other(self,i,son=None,brother=None):#i为节点的下标
if son!=None:
s = BENode(son)
self.data.append(s)
self.data[i].son = s
if brother!=None:
b = BENode(brother)
self.data.append(b)
self.data[i].brother=b
# 删除节点值
def delx(self,e):
for i in range(len(self.data)):# 从节点属性删除节点值
if self.data[i].brother != None:
if self.data[i].brother.data==e:
self.data[i].brother.data=None
break
if self.data[i].son != None:
if self.data[i].son.data==e:
self.data[i].son.data=None
break
for i in range(len(self.data)):# 从存储结构删除
if self.data[i].data==e:
self.data[i].data=None
break
#修改节点值,将e修改为n_e
def change(self,e,n_e):
for i in range(len(self.data)):# 从节点属性修改节点值
if self.data[i].brother!=None:
if self.data[i].brother.data==e:
self.data[i].brother.data=n_e
break
if self.data[i].son != None:
if self.data[i].son.data==e:# 从存储结构修改
self.data[i].son.data=n_e
break
for i in range(len(self.data)):
if self.data[i].data==e:
self.data[i].data=n_e
break
# 查询节点值,返回节点
def find(self,e):
for i in range(len(self.data)):
if self.data[i].data==e:
return self.data[i]
#先序遍历,传入的t的参数为self.data[0]
def display_f(self,t):
if t!=None:
print(t.data,end=' ')
self.display_f(t.son)
self.display_f(t.brother)
#后序遍历
def display_t(self,t):
if t!=None:
self.display_t(t.son)
self.display_t(t.brother)
print(t.data,end=' ')
#中序遍历
def display_m(self,t):
if t!=None:
self.display_m(t.son)
print(t.data,end=' ')
self.display_m(t.brother)
a = BEStree()
a.create_t('A')
a.create_other(0,'B')
a.create_other(1,'D','C')
a.create_other(2,'G')
a.create_other(3,'E')
a.create_other(5,None,'F')
#后序遍历
a.display_t(a.data[0])
print()
#中序遍历
a.display_m(a.data[0])
print()
#先序遍历
a.display_f(a.data[0])
print()
# 改变值
a.change('A',"10")
a.display_f(a.data[0])
print()
# 删除值
a.delx('10')
a.display_f(a.data[0])
长子兄弟链存储结构的优点:
1. 节省空间:相比于其他树的存储结构,长子兄弟链存储结构更加节省空间,因为它不需要额外的指针来表示左右子树。
2. 灵活性:长子兄弟链存储结构可以有效地表示任意形状的树,包括多叉树和不规则树,因此具有较强的灵活性。
3. 操作便利:在长子兄弟链存储结构中,树的节点之间使用指针连接,这样可以方便地进行树的遍历、插入、删除和查找等操作。
长子兄弟链存储结构的缺点:
1. 操作复杂性:相对于其他树的存储结构,长子兄弟链存储结构的操作可能会更加复杂,因为需要考虑节点之间的兄弟关系和孩子关系。
2. 不适用于特定场景:长子兄弟链存储结构主要适用于一般的树结构,对于特定的树,如二叉树或平衡树等,可能不是最佳的选择。
3. 不适合频繁修改的树:长子兄弟链存储结构对于频繁进行插入和删除操作的树可能不太适用,因为这样的操作可能会导致链的频繁调整,影响效率。