算法 --- > [队列结构]二叉树的层次遍历

在这里插入图片描述

思路

使用队列:

  1. 初始化的时候,将root, push进队列q中
  2. 循环队列q,当其中不为空时,取出第一个元素(q.shift),记为r
  3. 若r.left不为空,将r.left推进q,若r.right不为空,将r.right推进q

记录层次:
4. 初始化设置i =0;
5. 在入队的时候,入队一个对象{r: root, i}
6. 出队时,使用es6的解构赋值取出 {r , i}

  • 实现如下:
var averageOfLevels = function (root) {
	let q = []; 		// 队列
	let i = 0;		// 记录层次用的标记
	q.push({r: root, i});		// 将根放入队列中
	while(q.length > 0) {		// 队列不为空
		let { r, i } = q.shift();		// 得到根和层次信息
		if(r) {		// 根不为空
			i++;		// 层次加1
			if(r.left) {		// 左孩子不为空
				q.push(r.left);
			}
			if(r.right) {
				.push(r.right);		
			}
			console.log(r.val, i);
		}
	}
}

在这里插入图片描述

  • 上面基本上已经实现了层次遍历
  • 下面新增一个返回数组,实现题目需求
  1. 现在拥有的是层号和每层的值.
  2. 接下来将每层的层号和值作为键值对放入map结构中.
var averageOfLevels = function (root) {
    let q = [];
    let i = 0;
    let map = new Map;
    q.push({ r: root, i });
    while (q.length > 0) {
        let { r, i } = q.shift();
        if (r) {
            i++;
            if (r.left) {
                q.push({ r: r.left, i });
            }
            if (r.right) {
                q.push({ r: r.right, i });
            }
            // 改动部分, 使用map结构存储层次的 键值对
            if(map.has(i)){
                let arr = map.get(i);
                arr.push(r.val);
                map.set(i, arr);
            } else{
                map.set(i,[r.val]);
            }
        }
    }
    for(let [i, key] of map){
        console.log(i, key);
    }
};

在这里插入图片描述

  • 上面完成了将每层的层号和值作为键值对放入map结构中.
  • 下面修改末尾的for(let [i, key] of map)内部,使其满足题目的需求
let retArr = [];
for (let [i, key] of map) {
    let sum = 0;
    if (key.length > 1) {
        for (let i = 0; i < key.length; i++) {
            sum += key[i];
        }
    } else {
        sum = key[0];
    }
    retArr[i - 1] = sum / key.length;
}
return retArr

在这里插入图片描述

发布了177 篇原创文章 · 获赞 22 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/piano9425/article/details/103642466