获取节点,通用的 :
'''
学校
商学院 法学院 电子学院 计算机学院
软件 网络 数据
网1 网2 网3
1.根据当前节点获取父节点
2.根据当前节点获取所有子节点
3.根据当前节点获取所有祖先节点
4.根据当前节点获取所有子孙节点
5.根据当前节点获取所有兄弟节点
'''
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 getPartent(self,child):
return self.childToParent.get(child,'没有父亲节点')
def getChildren(self,parent):
return self.parentToChildren.get(parent,'没有下级')
#+=================================================++======
def getZuXian(self,zisun):
'''
思想就是递归问爹
1.可以获取上一级 getParent
2.如果我能够让上一级返回的数据在执行 getParent 执行直到没有上级终止
:param zisun:
:return:
'''
parent = self.getPartent(zisun)
if parent is None:
return []
zupu = self.getZuXian(parent)
zupu.append(parent)
return zupu
#======================+++++++++++++++++++++++++++++++++++==============================
def zisun(self,zs,zu):
'''
1.得到当前节点的孩子
2.便利当前节点的孩子,每一个孩子去得到他们的孩子
:param zs: 结果
:param zu: 条件
:return:
'''
children = self.getChildren(zu)
if children == "没有下级":
return
for c in children:
self.zisun(zs,c)
zs.extend(children)
#==========================================
def getSibling(self,s):
parent = self.getPartent(s)
children = self.getChildren(parent)
children.remove(s)
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.getPartent(child)
print("{0}的上级是:{1}".format(child,parent))
#根据当前节点获取所有子节点
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))
输出为:
网络的上级是:计算机学院
计算机学院的子级是:['软件', '网络', '数据']
网3的祖先是:['学校', '计算机学院', '网络']
学校的子孙是:['网1', '网2', '网3', '软件', '网络', '数据', '商学院', '法学院', '电子学院', '计算机学院']
法学院的兄弟是:['商学院', '电子学院', '计算机学院']