2015-04-13 4 views
0

Я знаю, как сделать это рекурсивно:Подсчет узлов бинарного дерева без рекурсии Python

def num_nodes(tree): 
if not tree.left and not tree.right: 
    return 1 
else: 
    return 1 + num_nodes(tree.left) + num_nodes(tree.right) 

Но как бы вы это не рекурсивно? Возникли проблемы с доступом к узлу, который находится справа от левого поддерева.

+0

Что вы подразумеваете под «Проблемы с доступом к узлу, который находится справа от левого поддерева»? – Joe

ответ

0

Вы можете сохранить узлы, которые вам нужно сделать в списке.

queue = [] 
count = 0 
queue.append(root) 
# Above is start of tree 

while(queue): 
    if queue[0].left: 
    queue.append(queue[0].left) 
    if queue[0].right: 
    queue.append(queue[0].right) 
    queue.pop(0) 
    count += 1 

который должен работать до тех пор, пока в вашем дереве нет никаких петель.

+0

@SakshamVarma Да, но то, что я говорю, использует .append() и .pop() - O (1) в среднем случае * и * амортизированный наихудший случай. И код Monacraft не нужно делать pop (0) или даже работать как очередь. Списки очень эффективны, если вы рассматриваете их как * стопки *. – Shashank

+0

@Shashank Yeah queue.pop() был бы лучшим выбором здесь. –

Смежные вопросы