LeetCode算法学习之--DFS&&BFS--515.在每个树行中找最大值

245 阅读2分钟

「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

大家好今天给大家分享下一道 LeetCode 困难度 的题目515. 在每个树行中找最大值

题目

给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。

image.png

分析

1.二叉树

2.找出每层中的最大值

3.返回一个每层最大值的数组

解法

1.DFS

2.BFS

解法一:DFS

思路
1.先递归进行二叉树的每个点的访问
2.在每层递归中记录节点的高度h,如果res[h]有值则和当前的root.val最比较留下最大值
3.在下一次递归中节点高度h+1
​
*/
​
var largestValues = function (root) {
  if (!root) return [];
  const res = [];
  function recur(root, h) {
    if (!root) {
      return;
    }
​
    if (res[h] !== undefined) {
      res[h] = Math.max(root.val, res[h]);
    } else {
      res[h] = root.val;
    }
​
    recur(root.left, h + 1);
    recur(root.right, h + 1);
  }
​
  recur(root, 0);
  return res;
};
/* 复杂度
时间 O(n)
空间 O(n)
*/

解法二:BFS

思路
1.使用queue队列来存储树的节点
2.在存储的节点中加入高度h
3.在每次迭代中 记录节点的高度h,如果res[h]有值则和当前的root.val最比较留下最大值
4.只有在节点存在的情况下才存入queue
*/
var largestValues = function (root) {
  if (!root) return [];
  const res = [];
  const queue = [];
  queue.push({ root, h: 0 });
​
  while (queue.length) {
    const { root, h } = queue.shift();
    if (res[h] !== undefined) {
      res[h] = Math.max(root.val, res[h]);
    } else {
      res[h] = root.val;
    }
​
    root.left && queue.push({ root: root.left, h: h + 1 });
    root.right && queue.push({ root: root.right, h: h + 1 });
  }
​
  return res;
};
/* 复杂度
  时间 O(n)
  空间 O(n)
  */

总结

今天这道题是主要是练习使用DFS和BFS来求解tree状结构类型的题目

大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢

大家如果对“TS”感兴趣的可以看看我的专栏 (TypeScript常用知识),感谢大家的支持

文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com

\