题目描述
算法
(后序遍历 自底向上)
这个题本身不难,重要的是用到了一种二叉树递归中的常用方法,自底向上递归,这样的好处是减少了很多重复计算,因为是先递归到最下面,然后下面的状态会被保存下来,上面要用时直接可以使用
这种思想是很重要的,比如LeetCode 1325. 删除给定值的叶子节点
- 后序遍历的思想就是自底向上
- 先求出左右子树的最小深度,那么当前树的最小深度就很容易求得
- 当然如果左子树或右子树不存在,则返回存在的那一侧树的最小深度即可
时间复杂度是 ,空间复杂度是
C++代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int minDepth(TreeNode* root) {
// Postorder traverse, Bottom-up
if (root == nullptr) return 0;
int left = minDepth(root->left);
int right = minDepth(root->right);
// LeftSubtree or Rightsubtree may be empty
if (left == 0) return right + 1;
if (right == 0) return left + 1;
return min(left, right) + 1;
}
};
另外:求树的最大深度的做法是类似的
代码
class Solution {
public:
int maxDepth(TreeNode* root) {
if (!root) return 0;
int left = maxDepth(root->left);
int right = maxDepth(root->right);
return max(left, right) + 1;
}
};
写在最后:我的博客主要是对计算机领域所学知识的总结、回顾和思考,把每篇博客写得通俗易懂是我的目标,分享技术和知识是一种快乐 ,非常欢迎大家和我一起交流学习,有任何问题都可以在评论区留言,也期待与您的深入交流(^∀^●)