1. 程式人生 > >【LeetCode 劍指Offer】 二叉樹的最大與最小深度

【LeetCode 劍指Offer】 二叉樹的最大與最小深度

求最大深度和最小深度。

 

最大深度

題目:

輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。

 

思路:

1,一個二叉樹的深度 = 以根節點為root的子樹的深度 = max ( 以root->left為root的子樹的深度, 以root->right為root的子樹的深度 ) + 1

2,如果一個節點為空,則該節點深度為0,或者說如果一個節點沒有左右子樹,則該節點深度為1

 

    int TreeDepth(TreeNode* pRoot)
    {
        if(!pRoot)     // 如果到達了空結點,則返回0深度
            return 0;
        int left = TreeDepth(pRoot->left);
        int right = TreeDepth(pRoot->right);
        return max(left, right) + 1;
    }

 

最小深度

最小深度簡單思考可以認為是最大深度類似問題,即一個樹的最小深度等於左右子數的最小深度+1。

稍加修改:

    int TreeDepth(TreeNode* pRoot)
    {
        if(!pRoot)     // 如果到達了空結點,則返回0深度
            return 0;
        int left = TreeDepth(pRoot->left);
        int right = TreeDepth(pRoot->right);
        return min(left, right) + 1;
    }

這麼做其實與題意不符。最小深度必須要到達一個葉結點,如果一個結點只有單側結點,上述方法會直接停止,得到錯誤的最小深度。見下圖:

 

故需要修改,增加判斷當前結點的左右結點是否為空:

(1)若有一個為空,則取另一側的最小長度+1(而不是之前那樣取為空位置的深度)

(2)當左右均不為空時再取兩者的最小深度。

    int run(TreeNode *root) {
        if (!root)
            return 0;
        if (!root->left)
            return run(root->right)+1;
        if (!root->right)
            return run(root->left)+1;
        return min(run(root->left), run(root->right)) + 1;
    }