LeetCode 题解 | 111. 树的最小深度(后序遍历 自底向上 C++)

题目描述

原题链接
在这里插入图片描述

算法

(后序遍历 自底向上) O ( n ) O(n)

这个题本身不难,重要的是用到了一种二叉树递归中的常用方法,自底向上递归,这样的好处是减少了很多重复计算,因为是先递归到最下面,然后下面的状态会被保存下来,上面要用时直接可以使用
这种思想是很重要的,比如LeetCode 1325. 删除给定值的叶子节点

  • 后序遍历的思想就是自底向上
  • 先求出左右子树的最小深度,那么当前树的最小深度就很容易求得
  • 当然如果左子树或右子树不存在,则返回存在的那一侧树的最小深度即可

时间复杂度是 O ( n ) O(n) ,空间复杂度是 O ( 1 ) O(1)

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;
    }
};

写在最后:我的博客主要是对计算机领域所学知识的总结、回顾和思考,把每篇博客写得通俗易懂是我的目标,分享技术和知识是一种快乐 ,非常欢迎大家和我一起交流学习,有任何问题都可以在评论区留言,也期待与您的深入交流(^∀^●)

发布了239 篇原创文章 · 获赞 80 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_43827595/article/details/104262139