任意树

'''
          学校
        商学院   法学院  电子学院     计算机学院
                                 软件      网络     数据
                                       网1 网2 网3

'''
# 任意树
# 根据当前节点获取父节点
# 根据当前节点获取所有子节点
# 根据当前节点获取所有祖先节点  只包含直系节点 不包含叔叔节点
# 根据当前节点获取所有子孙节点
# 根据当前节点获取所有兄弟节点
class Tree:
    childToParent=None
    parentToChildren=None
    def add(self,parent,child):
        if self.childToParent is None:
            self.childToParent={child:parent}
        else:
            self.childToParent[child]=parent
        if self.parentToChildren is None:
            self.parentToChildren={parent:[]}
        children=self.parentToChildren.get(parent,[])
        if len(children) == 0:
            self.parentToChildren[parent]=children
        children.append(child)
    def getParent(self,child):
        return self.childToParent.get(child,"没有父亲的节点")
    def getChildren(self,parent):
        return self.parentToChildren.get(parent,"没下级")
    def getZuXian(self,zisun):
        # 递归问祖先 可以获取上一级getparent
#      如果能让上一级继续getparent  直到获取完毕
        parent=self.getParent(zisun)
        if parent is None:
            return []
        zupu=self.getZuXian(parent)
        zupu.append(parent)
        return zupu
    def zisun(self,zs,zu):
#         第一步  得到当前节点的孩子
#         第二步  遍历当前节点的孩子  然后孩子去得到他们的孩子
        children=self.getChildren(zu)
        if children == '没下级':
            return
        for c in children:
            self.zisun(zs,c)
        zs.extend(children)
  
    def getSiBling(self,sibling):
        parent=self.getParent(sibling)
        children=self.getChildren(parent)
        children.remove(sibling)
        return children
if __name__=='__main__':
    tree=Tree()
    tree.add(None,'学校')
    tree.add('学校','商学院')
    tree.add('学校','法学院')
    tree.add('学校','电子学院')
    tree.add('学校','计算机学院')
    tree.add('计算机学院','软件')
    tree.add('计算机学院','网络')
    tree.add('计算机学院','数据')
    tree.add('网络','网1')
    tree.add('网络','网2')
    tree.add('网络','网3')
    # 根据当前节点获取父节点
    child='网络'
    parent=tree.getParent(child)
    print('{1}的上级是:{0}'.format(parent,child))
#     根据当前节点获取子节点
    parent='计算机学院'
    children=tree.getChildren(parent)
    print('{0}的子节点是:{1}'.format(parent,children))
#     获得所有的祖先节点
    zisun='网3'
    zuxian=tree.getZuXian(zisun)
    print('{0}的祖先是:{1}'.format(zisun,zuxian))
    # 根据当前节点获取所有子孙节点
    zu='学校'
    zs=[]
    tree.zisun(zs,zu)
    print('{0}的子孙是:{1}'.format(zu,zs))
  # 根据当前节点获取所有兄弟节点
    sibling='法学院'
    rs=tree.getSiBling(sibling)
    print('{0}的兄弟节点:{1}'.format(sibling,rs))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值