在查找子树的大小时,我在主题上看到的几乎所有在线教程都涉及在每个子树的子树上调用递归函数。
Python中的问题是,如果你递过几百个级别就会溢出,所以如果我理论上有一个长的线性树,它就会失败。
有没有更好的方法来解决这个问题?我需要使用堆栈吗?
答案 0 :(得分:2)
我是否需要使用堆栈?
当然,这是一种做法。
if leftOrRight == 0:
答案 1 :(得分:1)
您可以使用堆栈镜像递归算法:
Project Settings
有些注意事项:这仍然是深度优先搜索!也就是说,在开始探索另一个之前,我们仍然会完全探索一个子树。这对您来说意味着所需的额外内存量与树的高度成正比,而不是树的 width 。对于平衡树,树的宽度为QuickDialog
,其中numNodes = 0
nodeStack = [(root,0)] # (Node,0 means explore left 1 means explore right)
while nodeStack:
nextNode, leftOrRight = nodeStack.pop()
if not nextNode: #nextNode is empty
continue
if leftOrRight == 0:
numNodes += 1
nodeStack.append((nextNode,1))
nodeStack.append((nextNode.leftChild,0))
else:
nodeStack.append((nextNode.rightChild,0))
print(numNodes)
是树的高度。对于完全不平衡的树,树的高度是树中节点的数量,而宽度是1!所以这一切都取决于你需要的东西:)
现在值得一提的是,您可以通过检查其中一个子树是否为空来进行潜在优化!我们可以将2^h
的正文更改为:
h
可能会减少内存使用量:)
答案 2 :(得分:1)
堆栈将是获取子树大小的最简单的非递归方式(给定节点下的节点数,包括当前节点)
class Node():
def __init__(self, value):
self.value = value
self.left = None
self.right = None
def subtree_size(root):
visited = 0
if not root: return visited
stack = [root]
while stack:
node = stack.pop()
visited += 1
if node.left: stack.append(node.left)
if node.right: stack.append(node.right)
return visited