[英]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.