111. 二叉树的最小深度(C++)

题目

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明: 叶子节点是指没有子节点的节点。

示例:

给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回它的最小深度 2.

分析与题解

本体与二叉树的最大深度类似,一个是计算左右叶子结点的max,一个是min。但需要注意的是,在递归函数中,对于空结点,我们都返回0,当求取最大深度使用max函数时,非空结点肯定比空结点的返回值大。但在求取最小深度min函数时,一般空结点会求得相对更小的值,因此这里不能简单的使用min函数替换max函数,而需要对是否为空结点进行一个判断。

自底向上

自定义一个将深度作为形参的函数,每次递归调用,作为形参传入的深度就会加一。代码如下:

/**
* 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 getMinDepth(TreeNode* root, int depth){
        if(root==nullptr)
            return 0;
        int left = getMinDepth(root->left, depth+1);
        int right = getMinDepth(root->right, depth+1);
        if(root->left==nullptr && root->right==nullptr)
            return depth;
        else if(root->left==nullptr)
            return right;
        else if(root->right==nullptr)
            return left;
        else return min(left,right);
    }
    int minDepth(TreeNode* root) {
        int depth=1;
        return getMinDepth(root, depth);
    }
};

递归迭代

不将深度作为形参,在函数中层层迭代逐渐累加求得深度大小,代码如下:

/**
* 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) {
        if(root==nullptr)
            return 0;
        int left = minDepth(root->left);
        int right = minDepth(root->right);
        //比较前要排除某个子节点是空的情况
        //因为max的话肯定比空结点的0大
        if(root->left==nullptr)
            return right+1;
        else if(root->right==nullptr)
            return left+1;
        else return min(right,left)+1;
    }
};

BFS算法

因为需要求取最小深度,因此我们使用广度有限搜索算法逐层遍历,求得的第一个解即为本题答案。

每次把一层节点压入队列,同时判断这些节点中是否含有叶子节点(即左右指针都为空),若有,说明找到了最近的那个叶子节点,返回层数,代码如下。

/**
 * 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==nullptr) return 0;
        queue<pair<TreeNode*,int>> que;
        //对于根结点,当前深度为1
        que.push(make_pair(root, 1));
        while(!que.empty()){
            TreeNode* node = que.front().first;
            int depth = que.front().second;
            //记得出栈当前栈顶元素
            que.pop();
            //因为使用BFS
            //最先得出的有效解即为最小深度
            //设置终止条件
            if(node->left==nullptr && node->right==nullptr) return depth;
            if(node->left)
                que.push(make_pair(node->left, depth+1));
            if(node->right)
                que.push(make_pair(node->right, depth+1));   
        }
        return -1;
    }
};
posted @ 2020-09-09 20:17  脱线森林`  阅读(320)  评论(0编辑  收藏  举报