力扣日记11.28-【二叉树篇】二叉树的最小深度

力扣日记:【二叉树篇】二叉树的最小深度

日期:2023.11.28
参考:代码随想录、力扣

111. 二叉树的最小深度

题目描述

难度:简单

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

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

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

示例 1:
力扣日记11.28-【二叉树篇】二叉树的最小深度_第1张图片

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

示例 2:

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

提示:

  • 树中节点数的范围在 [0, 10^5] 内
  • -1000 <= Node.val <= 1000

题解

递归(cpp ver)

使用后序遍历(记得排除非叶子节点的情况)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
#define SOLUTION 2
class Solution {
public:
#if SOLUTION == 1
    // 1. 递归的参数以及返回值
    int getDepth(TreeNode* node) {
        // 2. 终止条件
        if (node == nullptr) return INT_MAX;    // 排除不是叶子节点
        if (node->left == nullptr && node->right == nullptr) return 1;  // 当前节点为叶子节点, 返回1(而不是0)
        // 3. 处理逻辑
        int leftDepth = getDepth(node->left);   // 左
        int rightDepth = getDepth(node->right); // 右
        int depth = 1 + min(leftDepth, rightDepth); // 中 
        return depth;
    }
    int minDepth(TreeNode* root) {
        if (root == nullptr) return 0;
        return getDepth(root);
    }
#elif SOLUTION == 2
    // 1. 递归参数与返回值(输入为当前节点,返回值为当前节点的高度)
    int getDepth(TreeNode* node) {
        // 2. 终止条件
        if (node == nullptr) return 0;
        // 3. 处理逻辑
        // 左
        int leftDepth = getDepth(node->left);
        // 右
        int rightDepth = getDepth(node->right);
        // 中
        // 注意最小深度是根节点到距离最近的叶子节点的节点数,因此要排除非叶子节点的情况
        if (node->left == nullptr && node->right != nullptr) {
            // 当左节点为空而右节点不为空,说明左节点不是叶子节点,说明最小深度是 1 + 右子树的深度
            return 1 + rightDepth;
        }
        if (node->right == nullptr && node->left != nullptr) {
            // 同理
            return 1 + leftDepth;
        }
        // 都不为空,则返回两者最小
        return 1 + min(leftDepth, rightDepth);
    }
    int minDepth(TreeNode* root) {
        return getDepth(root);
    }
#endif
};
迭代(go ver)

使用层序遍历

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func minDepth(root *TreeNode) int {
    queue := list.New()
    if root != nil {
        queue.PushBack(root)
    }
    curDepth := 0
    for queue.Len() > 0 {
        // 记录当前队列长度
        size := queue.Len()
        curDepth += 1   // 记录当前深度
        for size > 0 {  // 处理当前层
            // 弹出并写入结果
            front := queue.Front()
            node := queue.Remove(front).(*TreeNode) // 存进list之后类型会变为*list.Element,要转换为*TreeNode
            // 如果没有左右节点、说明到达了叶子节点,当前深度即为最小深度
            if node.Left == nil && node.Right == nil {
                return curDepth
            }
            if node.Left != nil {
                queue.PushBack(node.Left)
            }
            if node.Right != nil {
                queue.PushBack(node.Right)
            }
            size -= 1
        }
    }
    return curDepth
}

复杂度

时间复杂度:
空间复杂度:

思路总结

  • 注意最小深度是根节点到距离最近的叶子节点的节点数,因此要排除非叶子节点的情况

你可能感兴趣的:(leetcode,算法,职场和发展)