Python树实现-节点引用

标签 python tree

我有这段代码可以在Python中实现一棵树。其中一个功能是求下面所有节点(包括其自身)的值之和,但这不起作用。

我认为原因是因为,一旦我创建了一个节点,我就无法返回并使用 Node (name, value) 访问它 - 这将创建一个具有该名称和值的新节点,而不是引用树中具有该名称和值的一个,并且具有与其链接的子级。

因此,sum_below 函数只是返回节点的值。如何引用树中的节点:

class Node(object):
    def __init__(self, name, value):
        self.name = name
        self.value = value
        self.children = []

    def add_child(self, obj):
        self.children.append(obj)

    def sum_below(self):
        if self.children == []:
            return self.value
        else:
            ret = self.value
            for child in self.children:
                ret += child.sum_below()
            return ret
    def __str__(self, level = 0):
        ret = "\t"*level+repr(self.value)+"\n"
        for child in self.children:
            ret += child.__str__(level+1)
        return ret

[编辑]我的问题是,一旦创建节点,我就无法引用它:

#In [2]:

Node(1,100)
parent = Node(1,100)
child = Node(2, 200)
parent.add_child(child)

#In [5]:

print parent

#Out [5]:

100
    200

#In [6]:

print Node(1,100)

#Out [6]:

100

所以你看,parent 和 Node(1,100) 并没有引用相同的东西。

[编辑]

#In [5]:
parent.sum_below()
#Out[5]:
300
#In [6]:
Node(1,100).sum_below()
#Out[6]:
100

在上面的代码中,Node(1,100).sum_below() 应该等于parent.sum_below(),因为它们应该引用同一个节点,但事实并非如此。

最佳答案

代码看起来没问题。我看到的唯一“不完美”是特殊情况:

if self.children == []: ...

根本不需要。简化版本:

def sum_below(self):
    ret = self.value
    for child in self.children:
        ret += child.sum_below()
    return ret

也可以。还可以使用 sum 进一步简化:

def sum_below(self):
    return (self.value +
            sum(child.sum_below() for child in self.children))

关于Python树实现-节点引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33852659/

相关文章:

python - 无法在 PyQt5 中导入 QtWebKitWidgets

git - 使用 Trees API 将 git 树从一个 Github 存储库复制到另一个

python - Python 递归中的通用树

python - 我可以在 Jupyter 的什么地方放置启动脚本?

python - 在 python 中用 re.sub 替换单个单词

c++ - 树的直径

java - 打印二叉树的层序遍历,从左到右和从右到左交替

pointers - 可以将结构指针方法中的指针重新分配给另一个实例吗?

python - 如何在 Windows 命令提示符下运行 python 文件?

python - Pandas 的日期差异