在 python 应用程序中,我们有一个由TreeNode
对象组成的树,我们必须在类上添加一个属性,该属性以TreeNode
列表的形式返回从树根到该节点的路径。我们以简单的递归方式实现了这一点,但是对于 python 来说,代码看起来有点冗长(我们怀疑在 python 中有一种更简洁的方式来表达这样的简单算法)。有谁知道表达这一点的更pythonic的方式?
这是我们代码的简化版本 - 这是path_from_root
我们希望改进的定义:
class TreeNode(object):
def __init__(self, value, parent=None):
self.value = value
self.parent = parent
@property
def path_from_root(self):
path = []
_build_path_from_root(self, path)
return path
def _build_path_from_root(node, path):
if node.parent:
_build_path_from_root(node.parent, path)
path.append(node)
以下是一些显示如何path_from_root
工作的单元测试:
class TreePathAsListTests(unittest.TestCase):
def setUp(self):
self.root = TreeNode(value="root")
self.child_1 = TreeNode(value="child 1", parent=self.root)
self.child_2 = TreeNode(value="child 2", parent=self.root)
self.leaf_1a = TreeNode(value="leaf 1a", parent=self.child_1)
def test_path_from_root(self):
self.assertEquals([self.root, self.child_1, self.leaf_1a], self.leaf_1a.path_from_root)
self.assertEquals([self.root, self.child_2], self.child_2.path_from_root)
self.assertEquals([self.root], self.root.path_from_root)
更新:接受了一个明显改进的答案,但绝对仍然对任何其他表达方式感兴趣。