【发布时间】:2013-03-18 12:03:59
【问题描述】:
作为一个时间传递活动,我决定在 python 中实现一个Tree(like) 结构。
我实现了一个Node 类(仅用于此处),如下所示:
class Node:
def __init__(self, name, parent, *data):
self.name = name
self.parent = parent
self.data = data
self.children = []
self.is_root = False
def __repr__(self):
return 'Node '+repr(self.name)
def dic(self):
retval = {self:[]}
for i in self.children:
retval[self].append(i.dic())
return retval
def display(self): # Here
pass
def has_children(self):
return bool(self.children)
def get_parent(self):
return self.parent
def add_child(self, name, *data):
child = Node(name, self,*data)
self.children.append(child)
return child
如您所见,display 函数未实现。
这是一个示例树。
A = Node('A',Node)
A.is_root = True
B = A.add_child('B')
D = B.add_child('D')
C = A.add_child('C')
E = C.add_child('E')
F = C.add_child('F')
G = C.add_child('G')
这是display 的一些示例输出。
>>> A.display()
A
+-^-+
B C
| +-+-+
D E F G
>>> C.display()
C
+-+-+
E F G
简而言之,
如何从 Node 类“构建”一个 ASCII 树(如上)??
以更长的形式,
打印的“逻辑”是:
- 当只有一个孩子时,
|放在孩子的上方。 (D) - 否则,每个孩子的上方都有一个
+,(B,C,E,F) - 甚至没有的时候。的孩子,
^放在父母的下方。 (一) - 否则,(有奇数个子级)
+放在父级下方。 (C)
我一直在考虑从下面开始。 我意识到必须给每个孩子打电话,但一直无法实现任何(那种或其他的)提供任何接近它的东西。
【问题讨论】:
-
如果这是一个练习,你应该自己尝试一下,你会学得更好
-
"Drawing presentable trees" by Bill Mill 是我几周前遇到类似问题时使用的。它来自一个基本算法,并增加了对结果必须遵守的某些属性的限制,增加了几个步骤的复杂性。这是一篇很棒的文章,示例非常“通用”。看看吧。
-
@jamylak 这是一个自我给予的“锻炼”,所以,我不认为问这个问题会妨碍我的技能或学习。而且,我也有很多失败的尝试。另外,请阅读第一行...
-
@Schoolboy 文章基本解决了将
(x, y)坐标分配给树的节点的问题。然后,您需要解决一个新的(希望是)更简单的问题以获得最终输出:给定一组节点及其坐标,创建一个表示它们的 ASCII 字符串。我要做的第一件事是为x和y选择一个单位大小,找到如何绘制节点和弧线的约定,并手动检查结果如何。然后你必须自动化绘图。 -
你也可以使用github.com/mbr/asciitree的asciitree包,或者至少看看他是如何实现的。