C++ 二叉树的最小深度 [LeetCode 111]

 题目:

给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。

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

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

提示:
树中节点数的范围在 [0, 105] 内
-1000 <= Node.val <= 1000

链接:https://leetcode-cn.com/problems/minimum-depth-of-binary-tree

非递归方法的一种思路是用广度优先搜索,类似层次遍历的思想,遇到第一个left,right都为空的结点的层次就一定是所求。

递归遍历:

深度优先搜索,对于每一个非叶子节点,我们只需要分别计算其左右子树的最小叶子节点深度。这样就将一个大问题转化为了小问题,可以递归地解决该问题。

/**
 * 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) {}
 * };
 */
class Solution {
public:
    int minDepth(TreeNode* root) {
        if(!root)
            return 0;
        int left=minDepth(root->left),right=minDepth(root->right);
        return (left && right) ? 1+min(left,right):1+left+right;
    }
};

需要注意的是最后return语句里的三目运算符最后部分,如果不符合(left&&right)即有至少一侧为空的情况,实际上1+left+right执行时该结点最多存在一个子树(1 + left + 0 || 1 + right + 0)或者为叶子结点(1 + 0 + 0)。

posted @ 2021-09-27 17:00  北陌南旬  阅读(100)  评论(0)    收藏  举报