如果说深度遍历是在一个方向上“一头扎到底”,那么广度遍历则恰恰相反,现在各个方向上走出第1步,再在各个方向上走出第2步,第3步…一直在各个方向上全部走完。学习二叉树层序遍历时,第一次发现数据结构还是挺有意思的,选用不同的数据结构,对完成数据操作的难易程度和效率都有很大影响,根据不同业务场景,选择合适的数据结构,至关重要。

二叉树广度优先遍历java 二叉树的广度优先遍历_子节点

详细遍历步骤如下
1)根节点1进入队列;
2)节点1出队, 输出节点1, 并得到节点1的左子节点2、 右子节点3, 让节点2和节点3入队;
3)节点2出队,输出节点2,并得到节点2的左子节点4、 右子节点
5, 让节点4和节点5入队;
4)节点3出队, 输出节点3, 并得到节点3的右子节点6,让节点6入
队;
5)节点4出队, 输出节点4, 由于节点4没有孩子节点, 所以没有新节点入队;
6)节点5出队, 输出节点5, 由于节点5没有孩子节点, 所以没有新节点入队;
7)节点6出队, 输出节点6, 节点6没有子节点, 没有新节点入队。
至此遍历完毕。

二叉树广度优先遍历java 二叉树的广度优先遍历_unity_02


广度优先遍历比深度优先简单很多

这个思想,对于普通数和二叉树,都是成立的。

代码

最近真在实际运用中用到了这个东西

下面是简单版的代码

public void BreadthFirstSearch(ResourceNode rootNode)
    {
        Queue<ResourceNode> queue = new Queue<ResourceNode>();
        
        queue.Enqueue(rootNode);
        
        
        while (queue.Count > 0)
        {
            ResourceNode currentNode = queue.Dequeue();

            foreach (var dependency in 
                currentNode.antiDependencies)
            { 
                queue.Enqueue(dependency);
            }
        }
    }

如果要区分层,思路是将每层的个数记录起来,当出队列的个数达到每层个数的时候,就进入了下一层。每层的个数等于上一层所有节点的子节点的个数总和。 留个概念吧,构想好思路后发现实际暂时不需要。