''' 学校 商学院 法学院 电子学院 计算机学院 软件 网络 数据 网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))
任意树
最新推荐文章于 2023-04-24 20:02:17 发布