题目描述
题目链接:二叉树的最小深度
2 解答思路
递归分为三步,接下来就按照这三步来思考问题
第一步:挖掘出相同的子问题 (关系到具体函数头的设计)
第二步:只关心具体子问题做了什么 (关系到具体函数体怎么写,是一个宏观的过程)
第三步:找到递归的出口,防止死递归 (关系到如何跳出递归)
2.1 相同的子问题(函数头设计)
相同的子问题:找二叉树到叶子节点的最短距离,就是找左子树到叶子节点的最短距离和右子树到叶子节点的最短距离的最小值。
下面是leetcode给的函数头:
int minDepth(TreeNode* root) {}
传入一个二叉树,返回二叉树到叶子节点的最短距离。
根据“相同的子问题”,我们不仅需要传入一个二叉树,而且需要传递二叉树的深度,因此需要两个参数。设计的函数头如下:
void dfs(TreeNode* root, int cnt)
{
}
2.2 具体的子问题做了什么(函数体的实现)
具体的子问题:
1.记录当前节点的深度。
2.如果当前节点不是叶子节点就继续计算左子树和右子树的深度。
3.如果当前节点是叶子节点就判断当前深度和最小深度谁小,更新最小深度,然后直接返回(这也是一个递归的出口)
递归的出口:
1.当前节点为空:返回。
2.当前节点为叶子节点:更新值,返回。
函数的实现:
void dfs(TreeNode* root, int cnt){if (root == nullptr)return;cnt++;//当节点为叶子节点的时候更新答案if ((root->left == nullptr) && (root->right == nullptr)){ans = min(ans, cnt);return;}//如果不是叶子 -- cnt是局部变量,递归调用的时候会自动退回到当时的值dfs(root->left, cnt);dfs(root->right, cnt);}
总结
class Solution {
public:
//设置为全局变量就不用传递到函数里面去了int ans = INT_MAX;int minDepth(TreeNode* root) {//最开始的深度是0dfs(root, 0);return root ? ans : 0;}void dfs(TreeNode* root, int cnt){if (root == nullptr)return;cnt++;//当节点为叶子节点的时候更新答案if ((root->left == nullptr) && (root->right == nullptr)){ans = min(ans, cnt);return;}//如果不是叶子 -- cnt是局部变量,递归调用的时候会自动退回到当时的值dfs(root->left, cnt);dfs(root->right, cnt);}
};