我知道如何做到这一点递归:计数二叉树的节点,而不递归的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)
但是,你会怎么做非递归?无法访问左子树右侧的节点。
我知道如何做到这一点递归:计数二叉树的节点,而不递归的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)
但是,你会怎么做非递归?无法访问左子树右侧的节点。
您可以在列表中存储您必须执行的节点。
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
只要你的树没有任何循环,它应该工作。
@SakshamVarma是的,但我说的是使用.append()和.pop()在O(1)平均情况下*和*摊销最坏的情况。 Monacraft的代码不需要做pop(0),甚至不用做队列。当您将它们视为*堆栈*时,这些列表非常有效。 – Shashank
@Shashank是的queue.pop()将是一个更好的选择。 –
你的意思是“无法访问左子树右侧的节点”? – Joe