当前位置: 首页 > 面试题库 >

广度优先遍历

欧阳楚
2023-03-14
问题内容

我试图解决一个面试问题,但为此,我必须逐级遍历二叉树。我设计了具有以下变量的BinaryNode

private object data;
private BinaryNode left;
private BinaryNode right;

有人可以帮我在BinarySearchTree类中编写BreadthFirstSearch方法吗?

更新:谢谢大家的投入。这就是面试的问题。“给定二叉搜索树,设计一种算法,该算法创建每个深度的所有节点的链表(即,如果您有深度为D的树,则将有D链表)”。

这是我的方法,请告诉我您的专家意见。

public List<LinkedList<BNode>> FindLevelLinkList(BNode root)
    {
        Queue<BNode> q = new Queue<BNode>();
        // List of all nodes starting from root.
        List<BNode> list = new List<BNode>();
        q.Enqueue(root);
        while (q.Count > 0)
        {
            BNode current = q.Dequeue();
            if (current == null)
                continue;
            q.Enqueue(current.Left);
            q.Enqueue(current.Right);
            list.Add(current);
        }

        // Add tree nodes of same depth into individual LinkedList. Then add all LinkedList into a List
        LinkedList<BNode> LL = new LinkedList<BNode>();
        List<LinkedList<BNode>> result = new List<LinkedList<BNode>>();
        LL.AddLast(root);
        int currentDepth = 0;
        foreach (BNode node in list)
        {
           if (node != root)
            {
                if (node.Depth == currentDepth)
                {
                    LL.AddLast(node);
                }
                else
                {
                    result.Add(LL);
                    LL = new LinkedList<BNode>();
                    LL.AddLast(node);
                    currentDepth++;
                }
            }
        }

        // Add the last linkedlist
        result.Add(LL);
        return result;
    }

问题答案:

广度优先搜索通常使用 队列 来实现,深度优先搜索使用 堆栈

Queue<Node> q = new Queue<Node>();
q.Enqueue(root);
while(q.Count > 0)
{
    Node current = q.Dequeue();
    if(current == null)
        continue;
    q.Enqueue(current.Left);
    q.Enqueue(current.Right);

    DoSomething(current);
}

作为null出队后检查的替代方法,您可以在添加到队列之前进行检查。我没有编译代码,因此其中可能包含一些小错误。

与LINQ很好集成的更高级(但较慢)的版本:

public static IEnumerable<T> BreadthFirstTopDownTraversal<T>(T root, Func<T, IEnumerable<T>> children)
{
    var q = new Queue<T>();
    q.Enqueue(root);
    while (q.Count > 0)
    {
        T current = q.Dequeue();
        yield return current;
        foreach (var child in children(current))
            q.Enqueue(child);
    }
}

可以与以下Children属性一起使用Node

IEnumerable<Node> Children { get { return new []{ Left, Right }.Where(x => x != null); } }

foreach(var node in BreadthFirstTopDownTraversal(root, node => node.Children))
{
   ...
}


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

  • 主要内容:src/runoob/graph/ShortestPath.java 文件代码:广度优先遍历从某个顶点 v 出发,首先访问这个结点,并将其标记为已访问过,然后顺序访问结点v的所有未被访问的邻接点 {vi,..,vj} ,并将其标记为已访问过,然后将 {vi,...,vj} 中的每一个节点重复节点v的访问方法,直到所有结点都被访问完为止。 我们可以分为三个步骤: (1)使用一个辅助队列 q,首先将顶点 v 入队,将其标记为已访问,然后循环检测队列是否为空。 (2)如果队列不为空

  • 本文向大家介绍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;

  • 本文向大家介绍解释下深度优先遍历和广度优先遍历的区别及如何实现相关面试题,主要包含被问及解释下深度优先遍历和广度优先遍历的区别及如何实现时的应答技巧和注意事项,需要的朋友参考一下 1、深度优先采用堆栈结构,先进后出,所占的空间较小,执行时间较长; 2、广度优先采用队列结构先进先出,所占空间较大,执行时间短,空间换时间;

  • 在由具有指向父节点、兄弟节点和第一个/最后一个子节点的节点表示的通用树中,如: 是否可以在不使用任何其他帮助程序结构(如队列)的情况下执行迭代(非递归)广度优先(级别顺序)遍历。 所以基本上:我们可以使用单节点引用进行回溯,但不能保存节点集合。它是否能够完成是理论上的一部分,但更实际的问题是,它是否能够在不回溯大片段的情况下高效地完成。

  • 主要内容:深度优先搜索(简称“深搜”或DFS),广度优先搜索,总结前边介绍了有关图的 4 种存储方式,本节介绍如何对存储的图中的顶点进行遍历。常用的遍历方式有两种: 深度优先搜索和 广度优先搜索。 深度优先搜索(简称“深搜”或DFS) 图 1 无向图 深度优先搜索的过程类似于树的先序遍历,首先从例子中体会深度优先搜索。例如图 1 是一个无向图,采用深度优先算法遍历这个图的过程为: 首先任意找一个未被遍历过的顶点,例如从 V1 开始,由于 V1 率先访问过了,所以

  • 图 图是一种数据结构,其中节点可以具有零个或者多个相邻的元素,两个节点之间的连接成为边。节点也可以成为顶点。 邻接表: 邻接表一般采用数组+链表的形式,数组表示各个顶点,链表中的元素表示该顶点与链表中的元素相连,与链表本身的指针没有关系。如上图 数组0 对应的链表1->3->4 表示0这个顶点与1 3 4这个顶点连接 数组1 表示1这个顶点与 0 2 4顶点相连以此类推 邻接矩阵和邻接表的区别 邻