我从网上查了一个,树结构,但是我主要是不会 给一个初始条件 输出最后就是那个树结构,中间计算各个棋子的状态以及自动递归到下一层不知道怎么套进去
这是那个结构class TreeNode(object):
"""树节点类"""
def __init__(self, name, parent=None):
super(TreeNode, self).__init__()
self.name = name
self.parent = parent
self.child = {}
def __repr__(self) :
return 'TreeNode(%s)' % self.name
def __contains__(self, item):
return item in self.child
def __len__(self):
"""返回子节点长度"""
return len(self.child)
def __bool__(self, item):
"""对存在的节点返回true"""
return True
def path(self):
"""返回路径字符串(从根节点到当前节点)"""
if self.parent:
return '%s %s' % (self.parent.path.strip(), self.name)
else:
return self.name
def get_child(self, name, defval=None):
"""获取当前节点的子节点"""
return self.child.get(name, defval)
def add_child(self, name, obj=None):
"""对当前节点增加一个子节点"""
if obj and not isinstance(obj, TreeNode):
raise ValueError('TreeNode only add another TreeNode obj as child')
if obj is None:
obj = TreeNode(name)
obj.parent = self
self.child[name] = obj
return obj
def del_child(self, name):
"""从当前节点删除一个子节点"""
if name in self.child:
del self.child[name]
def find_child(self, path, create=False):
"""通过路径或名字找到子节点, 如果没找到返回None"""
# 如果输入是字符串,将路径转换为列表
path = path if isinstance(path, list) else path.split() #如果不是则分割为列表
cur = self
for sub in path:
# 搜索
obj = cur.get_child(sub)
if obj is None and create:
#可以增加需要的新节点
obj = cur.add_child(sub)
# 检查搜索是否完成
if obj is None:
break
cur = obj
return obj
def items(self):
return self.child.items()
def dump(self, indent=0):
"""将树转存为字符串,输出树状结构 """
tab = ' '*(indent-1) + ' |- ' if indent > 0 else ''
print('%s%s' % (tab, self.name))
for name, obj in self.items():
obj.dump(indent+1)
def preorder(self,tier=0):
"""先序遍历输出"""
print('%s' % (self.name))
for name, obj in self.items():
obj.preorder(tier+1)
if __name__ == '__main__':
root = TreeNode('tree') #'tree'
a1 = root.add_child('a1')
a1.add_child('b1')
a1.add_child('b2')
a1.add_child('b3')
a1.add_child('b4')
b3 = a1.add_child('b3')
b3.add_child('c1')
b3.add_child('c2')
c1 = b3.add_child('c1')
c1.add_child('d1')
b4 = a1.add_child('b4')
b4.add_child('c3')
root.dump()
root.preorder()
|