给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为 D,则会创建出 D 个链表)。返回一个包含所有深度的链表的数组。
示例:
输入:[1,2,3,4,5,null,7,8]
1
/ \
2 3
/ \ \
4 5 7
/
8
输出:[[1],[2,3],[4,5,7],[8]]
【思路】:
先用层次遍历确定 哪些节点在哪些层次上。(BFS)
再构造每一层的链表。
最后返回的结果是:若干条链表。(链表数组)
所谓链表数组,意思就是,数组里每个元素都是链表的头指针(或头节点)
提示:单链表插入时可以用一个尾指针,比较方便。
【代码】:
代码量有些大
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {TreeNode} tree
* @return {ListNode[]}
*/
//层次遍历
var levelOrder = function(node){
var que = [];
que.push(node);
let level = 0;
node.level = level;
var levelArr = [];
while(que.length != 0){
let front = que[0];
//处理每个节点
levelArr.push(front.level);
que.shift();
if(front.left != null){
front.left.level = front.level + 1;
que.push(front.left);
}
if(front.right != null){
front.right.level = front.level + 1;
que.push(front.right)
}
}
//返回maxlevel
return levelArr;
}
var bianli = function(node, map){
if(node != null){
let level = node.level;
map.get(level).push(node.val);
bianli(node.left, map);
bianli(node.right, map);
}
}
var build = function(node,levelArr){
var map = new Map();
var maxlevel = levelArr[levelArr.length - 1];
for(let i =0 ;i <= maxlevel;i++){
let val = map.get(i);
if(val == undefined){
map.set(i, []);
}
}
bianli(node, map);
var temparr = [];
for(let item of map){
temparr.push(item[1]);
}
return temparr;
}
var listOfDepth = function(tree) {
var levelArr = levelOrder(tree);
//arr = [[1],[2,3],[4,5,7],[8]]。接下来要把该数组转换成链表数组返回。
var arr = build(tree, levelArr);
var res = [];
//建四条链表
for(let i = 0;i < arr.length;i++){
//level == i
let head = null;
let tail = null; //尾插法
for(let j = 0;j < arr[i].length;j++){
let node = new ListNode(arr[i][j]);
if(head == null) {
head= node;node.next= null;tail = node;
}else{
node.next = tail.next;
tail.next = node;
tail = node;
}
}
res.push(head);
}
return res;
};