Python 子树中的节点总数(非二进制)

Python 子树中的节点总数(非二进制),python,recursion,tree,Python,Recursion,Tree,我当前正在尝试查找指定子树中所有节点的总和。例如,如果我有一棵树 A(5) / \ B(5) C(6) / / \ D(3) E(3) F(7) | G(1) 我想知道和(C),它应该返回17 这是我使用递归编写的代码,但我似乎无法访问超过2级的子树。我的算法似乎没有达到g。我正试图在递归方面做得更好,但我似乎无法解决这个问题 def navigate_tree(node,key): #node of

我当前正在尝试查找指定子树中所有节点的总和。例如,如果我有一棵树

     A(5)
     / \
   B(5) C(6)
   /    /  \
  D(3) E(3) F(7)
            |
            G(1)
我想知道
和(C)
,它应该返回17

这是我使用递归编写的代码,但我似乎无法访问超过2级的子树。我的算法似乎没有达到g。我正试图在递归方面做得更好,但我似乎无法解决这个问题

def navigate_tree(node,key): #node of the root of subtree, along with its key
    children = node.get_children()
    if (len(children) ==0):
        return node.key
    else:
        for child in children: #not a binary tree so trying to loop through siblings
            key += navigate_tree(child,key) #summing up key recursively
        return key 

如果有一个改进的界面,并且能够利用集合的功能,您会做得更好:

def navigate_tree(node): 
    children = node.get_children()
    key = node.key
    for child in children:
        key += navigate_tree(child)
    return key

# class Node and data A..G elided
print(navigate_tree(C))
输出:

17
17
17

代码似乎无法工作的原因是,您正在将上一个键向下传递到下一个递归级别。但是,您的代码似乎可以递归。如果您添加了一些
print(node.key)
您将看到您访问了所有正确的节点。

您可以使用递归和
sum

class Node:
  def __init__(self, n, v, c=[]):
    self.name, self.val, self.children = n, v, c

def get_sum(node):
   return node.val+sum(map(get_sum, node.children))

tree = Node('A', 5, [Node('B', 5, [Node('D', 3)]), Node('C', 6, [Node('E', 3), Node('F', 7, [Node('G', 1)])])])
print(get_sum(tree.children[-1]))
输出:

17
17
17
但是,如果您无法访问确切的节点
C
,则可以在递归函数中应用简单的搜索:

def get_sum(t, node):
  def inner_sum(d, s=False):
     return d.val*(s or d.name == t)+sum(inner_sum(i, s or d.name == t) for i in d.children)
  return inner_sum(node)

print(get_sum('C', tree))
输出:

17
17
17

我想你的意思是:
key+=导航树(child,child.key)
[btw,为什么签名有
节点和
key
。当然
key
是多余的?]是的,这很有意义。我将“key”放在签名中的原因是,我可以通过递归过程继续添加到变量中。我不太擅长递归,所以它可能是多余的。谢谢。是的,我注意到我访问了所有正确的节点,只是似乎从来没有得到正确的总和。它现在得到了正确的输出,谢谢。我想我得多练习递归。