二叉树 | 层次遍历(广度优先)

二叉树深度优先遍历的非递归做法是用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;
	}

比如下面这棵树:

  1. 根节点入队
  2. 开始while循环,遍历第一层(只有根节点),打印1,1出队,2和3入队。 此时队列:2 3
  3. 遍历第二层,打印2、2出队、4和5入队,此时队列:3 4 5
  4. 打印3、3出队,6入队,此时队列:4 5 6
  5. 遍历第三层(4 5 6),依次类推....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值