从根到选定节点的树路径 - Pythonic方式

时间:2013-07-04 10:50:29

标签: python algorithm recursion tree

在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)

更新:接受了一个明显改善的答案,但绝对仍然对其他任何表达方式感兴趣。

1 个答案:

答案 0 :(得分:1)

我会这样做:

@property
def path_from_root(self):
    if self.parent:
        return self.parent.path_from_root + [self]
    return [self]