如何打印在Python中实现为子树列表的树叶?

时间:2012-04-30 18:52:00

标签: python list tree

基本上我希望能够让类型树的每个节点都有一个数据字段和一个分支列表。此列表应包含许多Tree类型的对象。 我想我已经实现了列表的实际实现,但是当我尝试使用getLeaves方法时,我会遇到奇怪的行为。基本上它以递归方式调用自身并且永远不会返回,并且发生的方式是以某种方式树的第二个节点获得它的第一个分支集(我认为)。

class Tree:
    """Basic tree graph datatype"""
    branches = []

    def __init__(self, root):
        self.root = root

    def addBranch (self, addition):
    """Adds another object of type Tree as a branch"""
        self.branches += [addition]

    def getLeaves (self):
        """returns the leaves of a given branch. For leaves of the tree, specify root"""
        print (len(self.branches))
        if (len(self.branches) == 0):
            return self.root
        else:
            branchSum = []
            for b in self.branches:
                branchSum += b.getLeaves()
            return (branchSum)

3 个答案:

答案 0 :(得分:0)

self.root是所述树的父级吗?在这种情况下,getLeaves()如果没有分支(self)而不是len(self.branches)==0,则应返回self.root。此外,如果您有子分支,则应在self中包含branchSum

答案 1 :(得分:0)

可能的解决方案(您的源代码稍有更改):

class Tree:
    def __init__(self, data):
        """Basic tree graph datatype"""
        self.data = data
        self.branches = []

    def addBranch (self, addition):
        """Adds another object of type Tree as a branch"""
        self.branches.append(addition)

    def getLeaves (self):
        """returns the leaves of a given branch. For 
           leaves of the tree, specify data"""
        if len(self.branches) == 0:
            return self.data
        else:
            branchSum = []
            for b in self.branches:
                branchSum.append(b.getLeaves())
            return branchSum

## Use it

t0 = Tree("t0")
t1 = Tree("t1")
t2 = Tree("t2")
t3 = Tree("t3")
t4 = Tree("t4")

t0.addBranch(t1)
t0.addBranch(t4)
t1.addBranch(t2)
t1.addBranch(t3)

print(t0.getLeaves())

输出:

[['t2', 't3'], 't4']

说明:

  1. 看起来代码中的某些格式已损坏。
  2. 不确定这是不是你想要的。你想要所有叶子在列表的一个级别? (如果是这样,必须调整源代码。)

答案 2 :(得分:0)

您的'branches'变量是类成员,而不是实例成员。您需要在构造函数中初始化'branches'实例变量:

class Tree:
    """Basic tree graph datatype"""

    def __init__(self, root):
       self.branches = []
       self.root = root

其余代码看起来不错。