1. 程式人生 > 實用技巧 >111. 二叉樹的最小深度(C++)

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