簡體   English   中英

子樹中節點的總和(非二進制)

[英]Sum of nodes in a subtree (not binary)

我目前正在嘗試查找指定子樹中所有節點的總和。 例如,如果我有一棵樹

     A(5)
     / \
   B(5) C(6)
   /    /  \
  D(3) E(3) F(7)
            |
            G(1)

我想知道sum(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

您的代碼似乎不起作用的原因是您將前一個鍵向下傳遞到下一級遞歸。 但是,您的代碼似乎遞歸確定。 如果您添加了一些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

但是,如果您無權訪問確切的節點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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM