我的内存节点树很大,需要遍历该树。将每个子节点的返回值传递到其父节点。必须这样做,直到所有节点的数据都泡到根节点为止。
遍历是这样的。
private Data Execute(Node pNode)
{
Data[] values = new Data[pNode.Children.Count];
for(int i=0; i < pNode.Children.Count; i++)
{
values[i] = Execute(pNode.Children[i]); // recursive
}
return pNode.Process(values);
}
public void Start(Node pRoot)
{
Data result = Execute(pRoot);
}
这工作正常,但我担心调用堆栈会限制节点树的大小。
如何重写代码,以便不进行递归调用Execute
?
8
您要么必须维护自己的堆栈来跟踪节点,要么更改树的形状。参见stackoverflow.com/q/5496464和stackoverflow.com/q/4581576
—
Robert Harvey
我在此Google搜索中也找到了很多帮助,特别是Morris Traversal。
—
罗伯特·哈维
@RobertHarvey感谢Rob,我不确定这该用什么术语。
—
Reactgular 2014年
如果您进行了数学计算,您可能会对内存要求感到惊讶。例如,一个完美平衡的Teranode二叉树仅需要40个条目深的堆栈。
—
Karl Bielefeldt 2014年
@KarlBielefeldt假设树是完美平衡的。有时候,你必须塑造用于树木不均衡,在这种情况下,它是很容易吹堆栈。
—
2014年