原文: 数据结构—二叉树广度优先遍历
如果说深度遍历是在一个方向上“一头扎到底”,那么广度遍历则恰恰相反,现在各个方向上走出第1步,再在各个方向上走出第2步,第3步…一直在各个方向上全部走完。学习二叉树层序遍历时,第一次发现数据结构还是挺有意思的,选用不同的数据结构,对完成数据操作的难易程度和效率都有很大影响,根据不同业务场景,选择合适的数据结构,至关重要。
详细遍历步骤如下 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没有子节点, 没有新节点入队。 至此遍历完毕。
广度优先遍历比深度优先简单很多
这个思想,对于普通数和二叉树,都是成立的。
代码最近真在实际运用中用到了这个东西
下面是简单版的代码
public void BreadthFirstSearch(ResourceNode rootNode)
{
Queue queue = new Queue();
queue.Enqueue(rootNode);
while (queue.Count > 0)
{
ResourceNode currentNode = queue.Dequeue();
foreach (var dependency in
currentNode.antiDependencies)
{
queue.Enqueue(dependency);
}
}
}
如果要区分层,思路是将每层的个数记录起来,当出队列的个数达到每层个数的时候,就进入了下一层。每层的个数等于上一层所有节点的子节点的个数总和。 留个概念吧,构想好思路后发现实际暂时不需要。