LeetCode算法学习之--Recursion--二叉树的最小深度

354 阅读2分钟

大家好今天给大家分享下一道 LeetCode 中等难度 的题目[111. 二叉树的最小深度]

题目

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

示例 1:

输入:root = [3,9,20,null,null,15,7] 输出:2

示例 2:

输入:root = [2,null,3,null,4,null,5,null,6] 输出:5

分析

1.根节点到子叶节点的最短距离

2.子叶节点是没有左右子节点的节点

3.返回最短距离

解法

1.递归

2.迭代

解法一:递归

思路
1.终止条件是 没有任何子节点
2.递归的时候,携带每一层的高度,每次递归后h+1
3.需要注意 有子节点的时候再进行递归,否则会报空指针异常

*/
var minDepth = function (root) {
  // 初始一个最小知识为无限大
  let res = Infinity;
  //  当该树为空树时候 为一个特性情况 直接返回0
  if (!root) return 0;

  //   递归的时候携带高度
  function minDep(root, h) {
    // 当到达子叶节点 取最小值给res赋值
    if (!root.left && !root.right) {
      res = Math.min(res, h);
      return;
    }
    // 每次递归高度加一
    h = h + 1;
    // 需要注意 有子节点的时候再进行递归,否则会报空指针异常
    root.left && minDep(root.left, h);
    root.right && minDep(root.right, h);
  }

  minDep(root, 1);

  return res;
};

/* 复杂度
时间 O(n)
空间 O(n)
*/

解法二:迭代

思路
1.迭代和递归类似,只是采用的stack来模拟递归
2.stack 中推入 { root:root, h: 1 } 来记录每个节点的值和高度
3.当满足叶子节点的时候 开始更新res
*/

var minDepth = function (root) {
  // 初始一个最小知识为无限大
  let res = Infinity;
  //  当该树为空树时候 为一个特性情况 直接返回0
  if (!root) return 0;
  const stack = [];
//   stack 中推入 { root:root, h: 1 } 来记录每个节点的值和高度
  stack.push({ root, h: 1 });

  while (stack.length) {
    const { root, h } = stack.pop();
    // 当满足叶子节点的时候 开始更新res
    if (!root.left && !root.right) {
      res = Math.min(res, h);
    }

    root.left && stack.push({ root: root.left, h: h + 1 });
    root.right && stack.push({ root: root.right, h: h + 1 });
  }

  return res;
};
/* 复杂度
时间 O(n)
空间 O(n)
*/

总结

今天这道题是主要是练习递归的使用求最小深度 和 如何使用stack模拟递归求最小深度

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

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

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