2015-04-13 48 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是的queue.pop()将是一个更好的选择。 –