LeetCode算法学习之--Tree--N叉树的层序遍历

203 阅读3分钟

大家好今天给大家分享下一道 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