二叉树中的 BFS
我正在尝试编写二叉树中广度优先搜索的代码。我已将所有数据存储在队列中,但我不知道如何访问所有节点并消耗它们的所有子节点。
这是我的 C 代码:
void breadthFirstSearch (btree *bt, queue **q) {
if (bt != NULL) {
//store the data to queue if there is
if (bt->left != NULL) enqueue (q, bt->left->data);
if (bt->right != NULL) enqueue (q, bt->right->data);
//recursive
if (bt->left != NULL) breadthFirstSearch (bt->left, q);
if (bt->right != NULL) breadthFirstSearch (bt->right, q);
}
}
我已经将根数据排入队列,但它仍然不起作用。 有人能指出我的错误吗?
I'm trying to write the codes for breadth-first search in binary tree. I've stored all the data in a queue, but I can't figure out how to travel to all nodes and consume all their children.
Here's my code in C:
void breadthFirstSearch (btree *bt, queue **q) {
if (bt != NULL) {
//store the data to queue if there is
if (bt->left != NULL) enqueue (q, bt->left->data);
if (bt->right != NULL) enqueue (q, bt->right->data);
//recursive
if (bt->left != NULL) breadthFirstSearch (bt->left, q);
if (bt->right != NULL) breadthFirstSearch (bt->right, q);
}
}
I've already enqueued the root data, but it's still not working.
Can anyone point out my mistake?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
BFS 可以轻松编写,无需递归。只需使用队列来排序扩展:
关键是您不需要递归地遍历树;您只需让数据结构处理您访问节点的顺序即可。
请注意,我在这里使用的是 C++ 双端队列,但是任何可以让您将项目放在后面并从前面获取它们的东西都可以正常工作。
A BFS can be easily written without recursion. Just use a queue to order your expansions:
The key is that you don't need to traverse the tree recursively; you just let your data structure handle the order in which you visit nodes.
Note that I'm using the C++ deque here, but anything that lets you put items on the back and get them from the front will work fine.
首先,
head
节点被插入到队列中。当队列不为空时,循环将进行迭代。从头节点开始,在每次迭代中删除一个节点,并将非空子节点插入队列中。在每次迭代中,一个节点退出,并且其非空子节点被推送。在下一次迭代中,下一个最早发现的顶点(现在位于队列的前面)被取出(按照它们被发现的顺序),然后对它们进行处理以检查它们的子节点。当我们发现队列中不再有等待选择的已发现顶点时,迭代停止,因此选择了二叉树(图连通分量)中发现的所有顶点。
在你的代码中,首先将节点放入队列中,然后再次递归地遍历这些子节点,这将创建一个 DFS 模式。如果必须进行递归,则需要检查队列是否为空作为基本条件。还要检查一下你是如何通过队列的,我认为这可能是不正确的。我会建议一个迭代解决方案。
First the
head
node is inserted into the queue. The loop will iterate while the queue is not empty. Starting from the head node, in each iteration one node is removed and the non-null childs are inserted in the queue. In each iteration one node gets out and its non-null childs gets pushed. In the next iteration the next oldest discovered vertex, which is now at the front of the queue , is taken out (in the order they were discovered) and then they are processed to check their child.Above the iteration stops when we get that there is no more discovered vertex which are waiting to be selected, in the queue, so all the vertices which were discovered in the binary tree (graph connected component) is selected.
I your code first you pass enqueue the nodes in queue and then traverse these childs again recursively, which creates a DFS pattern. If you have to do recursion, you need to check for if the queue is empty as the base condition. Also have a check how you are passing the queue, i think it may be incorrect. I would suggest an iterative solution.
您在这里并不是进行广度优先遍历。相反,您将左右元素放入队列中并移动到左子树。您首先耗尽左子树,然后移动到右子树。
编写一个过程来将节点排入队列。
You are not doing a breadth first traversal here. Instead you are enqueuing the left and right element inside the queue and moving to the left subtree. You are exhausting the left subtree first and then moving on to the right subtree.
Write a procedure to enqueue the node instead.
这是一个BFS的静态代码,用于明确BFS的概念。
在此代码中,我使用了 2 个数组,一个在节点数组中,另一个是边缘数组。通过递归,我打印了有向图的每个节点的所有邻居。
这是代码:
This is a Static code for BFS to clear the concept of BFS.
In this code I have used 2 array one in node array and another one is edge array. And by recursion I have printed all the Neighbour of each Node for a directed graph.
This is the code: