如何遍历树中的实例?

时间:2016-10-16 16:27:08

标签: python python-2.7

我在python中遇到了一个自编写树类的问题:

class Tree:
    def __init__(self, parent=0, value=0):
        self.value = value
        self.parent = parent
    def __iter__(self): return self
    def next(self):
        tmp = self.value
        try:
            self.parent = self.parent.parent
            self.value = self.parent.value
        except AttributeError:
            raise StopIteration
        return tmp
    def sum(self):
        list_ = [item for item in self]
        print list_
        return sum(list_)

实际上,“树”并未完全写入,但当前的问题阻碍了进一步的进展。 该结构只有两个实例变量(valueparent)。 我想将当前实例的值与迭代器的第一个父值相加(如果它们可以一起使用)。 sum方法用于此方法(不需要额外的list_变量,但有助于进一步解释问题)。

运行测试用例时

parent = Tree()
child = Tree(parent=parent, value=8)
child2 = Tree(parent=child,value=10)
print child2.sum()

我获得以下内容:

[10]
10

请问,任何人都可以解释为什么值列表只包含一个数字,虽然它应该看起来像[10,8]?似乎问题出在iternext的实现中,但我无法理解如何修复解决方案。

提前谢谢。

2 个答案:

答案 0 :(得分:0)

你走了:

class Tree:
    def __init__(self, parent=None, value=0):
        self.value = value
        self.parent = parent

    def __iter__(self): 
        yield self.value
        root = self
        while root.parent is not None:
            yield root.parent.value
            root = root.parent
        raise StopIteration


    def tree_sum(self):
        return sum(list(self))


parent = Tree()
child = Tree(parent=parent, value=8)
child2 = Tree(parent=child,value=10)

我已将默认parent值更改为无。

for i in child2:
    print(i)

10
8
0 # 0 is here because the parent value is 0 by default.

答案 1 :(得分:0)

我不确定你可以称之为Tree。人们会期望父节点和多个叶子节点,而不仅仅是对象的线性连接。

请参阅:A general tree implementation?

另外请注意,如果您要实施链接列表,则应考虑Barny对您的问题的评论中提出的建议,您也可以关注:Python Linked List

来到你当前的实现,你需要某种循环,从当前子节点一直走到头父节点。如果未找到下一个父属性,请停止迭代。以下将逻辑放在类的__iter__方法中,该方法现在是生成函数:

class Tree:
    def __init__(self, parent=None, value=0):
        self.value = value
        self.parent = parent

    def __iter__(self): 
        _parent = self.parent
        yield self.value
        while True:
            try:               
                yield _parent.value 
                _parent = _parent.parent
            except AttributeError:
                break  

    def sum_from_node(self):
        list_ = [item for item in self]
        print list_
        return sum(list_)

演示:

parent = Tree()
child = Tree(parent=parent, value=8)
child2 = Tree(parent=child,value=10)
child3 = Tree(parent=child2,value=4)
print child3.sum_from_node()
# [4, 10, 8, 0]
# 22