python树长子兄弟链存储结构(孩子兄弟链存储结构)

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

长子兄弟链存储结构(孩子兄弟链存储结构)解释:

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

        长子兄弟链存储结构是一种树的存储结构,它使用孩子兄弟表示法(也称作左孩子右兄弟表示法)来表示树的结构。这种表示方法主要用于存储一般的树,而不是二叉树。

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

        在长子兄弟链存储结构中,树中的每个节点都有两个指针:一个指向它的第一个孩子节点,另一个指向它的右边(兄弟)的节点。这种表示方法使用了类似链表的结构,使得树的每个节点可以灵活地连接到它的子节点和兄弟节点。

        使用长子兄弟链存储结构,可以有效地表示任意形状的树,而且在进行树的遍历和操作时也相对容易。这种存储结构的主要优点是节省空间,因为不需要额外的指针来表示左右子树,同时也便于实现树的各种操作,如插入、删除和查找等。长子兄弟链存储结构在树的应用中具有一定的灵活性和效率。

 代码:

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. 不适合频繁修改的树:长子兄弟链存储结构对于频繁进行插入和删除操作的树可能不太适用,因为这样的操作可能会导致链的频繁调整,影响效率。

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Guff_hys

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值