如何在不使用递归的情况下遍历一个 n 叉树?
递归方法:
traverse(Node node)
{
if(node == null)
return;
for(Node child : node.getChilds()) {
traverse(child);
}
}
如何在不使用递归的情况下遍历一个 n 叉树?
递归方法:
traverse(Node node)
{
if(node == null)
return;
for(Node child : node.getChilds()) {
traverse(child);
}
}
你正在做的本质上是树的深度优先遍历。你可以通过使用堆栈来消除递归:
traverse(Node node) {
if (node==NULL)
return;
stack<Node> stk;
stk.push(node);
while (!stk.empty()) {
Node top = stk.pop();
for (Node child in top.getChildren()) {
stk.push(child);
}
process(top);
}
}
如果你想使用广度优先搜索(BFS),请使用队列:traverse(Node node) {
if (node==NULL)
return;
queue<Node> que;
que.addRear(node);
while (!que.empty()) {
Node front = que.deleteFront();
for (Node child in front.getChildren()) {
que.addRear(child);
}
process(front);
}
}
如果您想使用其他遍历方式,您将需要采取相同的方法,但使用不同的数据结构来存储节点。也许可以使用优先队列(如果您想要在每个节点上评估一个函数并根据该值处理节点)。
process(top)
意味着什么?它是做什么用的? - jbuddy_13process
处理这个过程。 - BiGYaNtraverse(Node node) {
while (node) {
if (node->current <= MAX_CHILD) {
Node prev = node;
if (node->child[node->current]) {
node = node->child[node->current];
}
prev->current++;
} else {
// Do your thing with the node.
node->current = 0; // Reset counter for next traversal.
node = node->parent;
}
}
}
没有提供语言,因此使用伪代码进行举例:
traverse(Node node)
{
List<Node> nodes = [node];
while (nodes.notEmpty) {
Node n = nodes.shift();
for (Node child in n.getChildren()) {
nodes.add(child);
}
// do stuff with n, maybe
}
}
请注意这是广度优先遍历,不同于问题中给出的深度优先遍历。你可以通过从nodes
列表中pop
最后一项而不是shift
第一项来进行深度优先遍历。