二叉树深度优先遍历的非递归做法是用stack实现,而层次遍历多是使用队列实现。
主要思路:
从根结点开始,未访问的结点入队,访问后则出队,并将其左右子结点入队,直到叶子结点结束.
分层访问,即通过队列长度控制每层遍历访问的节点数.如第一层访问一个节点后,queue此时为第二层的节点,queue.length为2,第二层访问两个节点后,queue此时为第三层的节点…
function BFS(root){
let result = [];
let queue = [];
if(root){
result.push(root);
queue.push(root);
}
while(queue.length){
// 每一层的节点数
let level = queue.length
// 遍历该层
for(let i=0;i<level;i++){
// 当前节点出队
let cur = queue.shift();
// 出队结点的左右节点入队
cur.left ? queue.push(cur.left):'';
cur.right? queue.push(cur.right):'',
result.push(cur.val);
}
}
return result;
}
比如下面这棵树:
- 根节点入队
- 开始while循环,遍历第一层(只有根节点),打印1,1出队,2和3入队。 此时队列:2 3
- 遍历第二层,打印2、2出队、4和5入队,此时队列:3 4 5
- 打印3、3出队,6入队,此时队列:4 5 6
- 遍历第三层(4 5 6),依次类推....