当前位置: 首页 > 知识库问答 >
问题:

无队列的非递归广度优先遍历

谢选
2023-03-14

在由具有指向父节点、兄弟节点和第一个/最后一个子节点的节点表示的通用树中,如:

class Tnode {

    def data
    Tnode parent = null
    Tnode first_child = null, last_child = null 
    Tnode prev_sibling = null, next_sibling = null 

    Tnode(data=null) {
        this.data = data
    }
}

是否可以在不使用任何其他帮助程序结构(如队列)的情况下执行迭代(非递归)广度优先(级别顺序)遍历。

所以基本上:我们可以使用单节点引用进行回溯,但不能保存节点集合。它是否能够完成是理论上的一部分,但更实际的问题是,它是否能够在不回溯大片段的情况下高效地完成。

共有1个答案

宣熙云
2023-03-14

是的,你可以。但是这很可能是一个权衡,并且花费你更多的时间。

一般来说,一种方法是理解一个人可以在树中实现遍历而无需额外的内存。使用它,您可以执行迭代深化DFS,它以与BFS发现新节点相同的顺序发现新节点。

这需要做一些记录,记住“你刚从哪里来”,并据此决定下一步做什么。

树的伪代码:

special_DFS(root, max_depth):
  if (max_depth == 0):
    yield root
    return
  current = root.first_child
  prev = root
  depth = 1
  while (current != null):
    if (depth == max_depth):
      yield current and his siblings
      prev = current
      current = current.paret
      depth = depth - 1
  else if ((prev == current.parent || prev == current.previous_sibling)
           && current.first_child != null):
    prev = current
    current = current.first_child
    depth = depth + 1
  // at this point, we know prev is a child of current
  else if (current.next_sibling != null):
    prev = current
    current = current.next_sibling
  // exhausted the parent's children
  else:
    prev = current
    current = current.parent
    depth = depth - 1

然后,您可以使用以下命令遍历您的关卡顺序:

for (int i = 0; i < max_depth; i++):
   spcial_DFS(root, i)
 类似资料:
  • 在这篇文章中,biziclop为非递归深度优先搜索算法插入了伪代码。 如果我们想使用递归DFS算法来检查节点的适当性,我们可以利用两个变体:pre-order(当一个节点在其子节点之前检查时)和post-order(当子节点在节点之前检查时),加上仅针对二叉树的第三个变体(顺序:左子树,然后节点,然后右子树)。 如果可能的话,我对这三个变体都很感兴趣,所以我试图修改biziclop的伪代码,以便获

  • 4. 队列与广度优先搜索 队列也是一组元素的集合,也提供两种基本操作:Enqueue(入队)将元素添加到队尾,Dequeue(出队)从队头取出元素并返回。就像排队买票一样,先来先服务,先入队的人也是先出队的,这种方式称为FIFO(First In First Out,先进先出),有时候队列本身也被称为FIFO。 下面我们用队列解决迷宫问题。程序如下: 例 12.4. 用广度优先搜索解迷宫问题 #i

  • 广度优先搜索(BFS)算法以宽幅运动遍历图形并使用队列记住在任何迭代中发生死角时获取下一个顶点以开始搜索。 如在上面给出的示例中,BFS算法首先从A到B到E到F,然后到C和G,最后到D.它采用以下规则。 Rule 1 - 访问相邻的未访问顶点。 将其标记为已访问。 显示它。 将其插入队列中。 Rule 2 - 如果未找到相邻顶点,则从队列中删除第一个顶点。 Rule 3 - 重复规则1和规则2,直

  • 主要内容:递归实现,非递归实现二叉树先序遍历的实现思想是: 访问根节点; 访问当前节点的左子树; 若当前节点无左子树,则访问当前节点的右子树; 图 1 二叉树   以图  1 为例,采用先序遍历的思想遍历该二叉树的过程为: 访问该二叉树的根节点,找到 1; 访问节点 1 的左子树,找到节点 2; 访问节点 2 的左子树,找到节点 4; 由于访问节点 4 左子树失败,且也没有右子树,因此以节点 4 为根节点的子树遍历完成。但节点

  • 本文向大家介绍Javascript中的广度优先搜索遍历,包括了Javascript中的广度优先搜索遍历的使用技巧和注意事项,需要的朋友参考一下 BFS在访问子顶点之前先访问邻居顶点,并且在搜索过程中使用队列。以下是BFS的工作方式- 访问相邻的未访问顶点。将其标记为已访问。显示它。将其插入队列。 如果找不到相邻的顶点,请从队列中删除第一个顶点。 重复规则1和规则2,直到队列为空。 让我们看一下BF

  • 我们不会在C编程语言中看到广度优先遍历(或广度优先搜索)的实现。 出于参考目的,我们将遵循我们的示例并将其作为我们的图形模型 - 用C实现 (Implementation in C) #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAX 5 struct Vertex { char label;