1

我有以下用于广度优先搜索的算法:

q := []
q.append(root node of tree)
while q:
    n := q.pop(0)
    yield n
        if n has children:
            c := children of node
            for i in c:
                q.append(i)

1)如何扩展它以跟踪当前深度?2) 这个扩展是否适用于深度优先搜索的类似算法,队列q被堆栈替换?

4

2 回答 2

7

只需将深度与节点一起存储,并在每次生成节点的子节点时递增。

q := [(root, 0)]
while q:
    n, depth := q.pop()
    yield n, depth
    if n has children:
        c := children of n
        for i in c:
            q.append(i, depth + 1)

这个想法延伸到 DFS 和启发式引导搜索。

于 2013-08-01T09:38:32.667 回答
1

为了扩展 larsmans 的出色答案,下面是我用于深度限制广度优先二叉树遍历的

(代码假定 Node 不包含深度信息,并在入队之前将每个节点包装在 NodeAndDepth 结构中。)

struct NodeAndDepth {
    NodeAndDepth(Node *n, unsigned int d) : node(n), depth(d) {}
    Node *node;
    unsigned int depth;
};

void traverseBreadthFirst_WithDepthLimit(Node *root, unsigned int maxDepth) {
    if (maxDepth == 0 || root == NULL) { return; }

    std::queue<NodeAndDepth> q;
    q.push(NodeAndDepth(root, 1));

    while (!q.empty()) {
        NodeAndDepth n = q.front(); q.pop();

        // visit(n.node); 
        // cout << n.depth << ": " << n.node->payload << endl;

        if (n.depth >= maxDepth) { continue; }

        if (n.node->left != NULL) {
            q.push(NodeAndDepth(n.node->left, n.depth + 1));
        }

        if (n.node->right != NULL) {
            q.push(NodeAndDepth(n.node->right, n.depth + 1));
        }
    }
}
于 2013-09-08T12:23:52.863 回答