大家好今天给大家分享下一道 LeetCode 中等难度 的题目429. N 叉树的层序遍历
题目
示例 1:
输入:root = [1,null,3,2,4,null,5,6] 输出:[[1],[3,2,4],[5,6]] 示例 2:
(图片来自leetcode)
输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14] 输出:[[1],[2,3,4,5],[6,7,8,9,10],[11,12,13],[14]]
分析
1.每一层的节点进行遍历,遍历的值需要形成一个数组
2.每层节点是从左到右
3.返回一个二维数组,数组首部代表最顶层节点数组,尾部代表底层的节点数组
解法
1.递归
2.迭代
解法一:递归
思路
1.递归访问每一层节点,每一层有个高度h
2.递归每一层的子节点的时候 高度 h++
3.终止条件 root===null
*/
var levelOrder = function (root) {
const res = [];
function leveOrderRecursive(root, h) {
// 终止条件
if (!root) return;
// 查看高度h 在res中是否有值,有值就push(root.val) 没有就创建一个数组[root.val]
res[h] ? res[h].push(root.val) : (res[h] = [root.val]);
// 递归子节点需要高度h++
h++;
for (const node of root.children) {
leveOrderRecursive(node, h);
}
}
leveOrderRecursive(root, 0);
return res;
};
/* 复杂度
时间 O(n)
空间 O(n)
*/
解法二:迭代
思路
1.创建一个栈stack,把需要访问的节点和节点在树中的高度h推入栈中
2.在遍历的时候 stack.pop 取出节点,然后判断当前高度h是否已经存储了节点的数组
3.再遍历节点的children.reverse() (因为stack是取的末尾 所以这里需要翻转数组),把高度和节点推入栈中
*/
var levelOrder = function (root) {
// 如果root 为空则直接返回[]
if (!root) return [];
const res = [];
const stack = [];
// 栈的第一次放入一个对象 包括 节点和高度 {root,h}
stack.push({ root, h: 0 });
while (stack.length) {
// 取出末尾的节点
let { root, h } = stack.pop();
// 查看高度h 在res中是否有值,有值就push(root.val) 没有就创建一个数组[root.val]
res[h] ? res[h].push(root.val) : (res[h] = [root.val]);
// 子节点需要高度h++
h++;
// 因为是取出末尾的节点 所以需要翻转root.children
for (const node of root.children.reverse()) {
// 迭代的时候同样包含节点和高度
stack.push({ root: node, h });
}
}
return res;
};
/* 复杂度
时间 O(n)
空间 O(n)
*/
总结
今天这道题是主要是练习对TREE的每层节点的遍历,递归比较简单,但是迭代就是一个把递归隐形的栈转化成一个显性的栈的过程
大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢
大家如果对“TS”感兴趣的可以看看我的专栏 (TypeScript常用知识),感谢大家的支持
文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com