簡體   English   中英

計算 N 叉樹的奇數

[英]count odd numbers of an N-ary tree

我在這個練習中掙扎。 它告訴我計算 N-Ary 中存在的所有奇數。 練習要求我使用遞歸

看看下面的樹

              5                                           
      ________|_____________                        
     |          |           |                     
     20         4           6                     
     |     _____|______                      
     11   |   |  |  |  |                    
          10  2  9  8  7                  
            __|__                        
           |     |                    
           3     1         

里面有12個數字。 在這些數字中,有 6 個是奇數,這是我正在尋找的輸出。 但是,我編寫的代碼並沒有解決問題,我不明白為什么。

我實現的函數返回 0,這是不正確的。

def es7(tree):
    n = 0
    for element in tree.f: 
        n = es7(element)
        if element.id % 2 == 1: 
            n += 1 
    return n  
 

class Nodo:
    def __init__(self,V):
        self.id=V
        self.f=[]


################### DA QUI IN GIÙ SONO SOLO FUNZIONI NECESSARIE PER I TEST #####################

def fromLista(lista):
    '''Crea l'albero da una lista [valore, listafigli]
           In cui lista figli contiene alberi o e' la lista vuota. '''
    r=Nodo(lista[0])
    r.f=[fromLista(x) for x in lista[1]]
    return r

def toLista(nodo):
    ''' Converte l'albero in una lista di liste [valore, listafigli]'''
    return [nodo.id, [toLista(x) for x in nodo.f]]   

有什么建議么?

謝謝

解決這個問題的一種簡單方法; 就是簡單地對N-ary樹進行級別順序遍歷。

考慮以下迭代解決方案,它們可以為編寫遞歸解決方案提供一些見解。

要重新編寫您的代碼,我會在這些行上做一些事情。
考慮下面的這個片段:

def es7(tree):
    q, level = [tree], []
    while any(q):
        level.append([node.id for node in q])
        q = [child for node in q for child in node.f if child]

    ans = 0
    for l in level:
        for num in l:
            if num & 1:
                ans += num
    return ans

考慮下面的代碼片段:(非遞歸解決方案)

from collections import deque

class Node:
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children

class Solution:
    def levelOrder(self, root: 'Node') -> List[List[int]]:
        if not root:
            return 
        
        q = deque([root])
        level = 0
        result = []
        
        while q:
            result.append([])
            for i in range(len(q)):
                node = q.popleft()
                result[level].append(node.val)
                
                for c in node.children:
                    q.append(c)
            
            level += 1
        
        return result

在上面的代碼中, result將根據級別包含n-ary叉樹的所有元素。 解析列表,並添加所有奇數。

那將是這樣的事情:-

for level in result:
    for num in result:
        if num & 1:
           ans += num

或者,您也可以在遍歷樹時將所有odd-numbers

您在每次迭代時都在遮蔽n 你可能想要做的是

def es7(tree):
    n = 0
    for element in tree.f: 
        n += es7(element) # <-- note the `+=`
        if element.id % 2 == 1: 
            n += 1 
    return n

但是,我認為這段代碼仍然不完全正確(取決於您對樹的表示),您可能會在具有單個奇數的樹上實現這一點。

暫無
暫無

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

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