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)。
荡尘涤污,重整河山,便在今日

浙公网安备 33010602011771号