我有一棵树。我有几个涉及扫描整棵树的任务。
我想编写一个函数,例如scanTree ()
,它将按特定顺序扫描树,然后返回一个可迭代对象。
这个想法是:
def task1 (self):
x = self.scanTree ()
for y in x:
do_something1(y)
def task2 (self):
x = self.scanTree ()
for y in x:
do_something2(y)
但我不知道我可以在函数scanTree
中返回什么样的对象。
你能给我一些提示吗?
非常感谢,
答案 0 :(得分:1)
这看起来像是generators的工作。假设您的btree类看起来像这样:
df = pd.DataFrame([
(0, (1,2)),
(1, (2,3))
])
df.nunique()
# 0 2
# 1 2
# dtype: int64
然后,您可以编写一个class BTree:
def __init__(self, value, left=None, right=None):
self._value = value
self._left = left
self._right = right
按顺序进行按顺序遍历:
scanTree()
然后你就这样使用它:
def scanTree(self):
'''
Traverse the binary tree in-order
'''
if self._left is not None:
yield from self._left.scanTree()
yield self._value
if self._right is not None:
yield from self._right.scanTree()
这里有很多概念可以深入理解这一点,但基本思想非常直观:你编写相同的循环,就好像你打算按照你想要的顺序打印元素,除了你使用{{1而不是打印,并且只要你递归就>>> l = BTree(1)
>>> r = BTree(3)
>>> t = BTree(2, l, r)
>>> it = t.scanTree()
>>> it
<generator object BTree.scanTree at 0x7fc20602a728>
>>> list(it)
[1, 2, 3]
。