leetcode 111 二叉樹的最小深度

不會code的菜鳥發表於2020-12-13

給定一個二叉樹,找出其最小深度。

最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。

說明:葉子節點是指沒有子節點的節點。

參考二叉樹的最大深度,傳送門:
https://blog.csdn.net/CLZHIT/article/details/111118994
參考來自微信公眾號程式碼隨想錄的文章:
二叉樹的最小深度
解法一:遞迴解法
求二叉樹的最小深度和求二叉樹的最大深度的差別主要在於處理左右孩子不為空的邏輯。

class Solution {
public:
    int minDepth(TreeNode* root) {
        // if(root == nullptr)
        // {
        //     return 0;
        // }
        // return process1(root, 1);
        return process2(root);
    }

    int process1(TreeNode* root, int level)
    {
        if(!root->left && !root->right) return level;
        int res  = INT_MAX;
        if(root->left) res = min(res, process1(root->left, level+1));
        if(root->right) res = min(res, process1(root->right, level+1));
        return res;
    }

    int process2(TreeNode* root)
    {
        if(root == nullptr) return 0;
        int leftDepth = process2(root->left);
        int rightDepth = process2(root->right);
        if(!root->left && root->right) return 1+rightDepth;
        if(!root->right && root->left) return 1+leftDepth;
        int result = 1 + min(leftDepth, rightDepth);
        return result;
    }
};

解法二:非遞迴解法
需要注意的是,只有當左右孩子都為空的時候,才說明遍歷的最低點了。如果其中一個孩子為空則不是最低點。

class Solution {
public:
    int minDepth(TreeNode* root) {
        int depth = 0;
        queue<TreeNode*> que;
        vector<int> level;
        int flag = false;
        if(root != nullptr) que.push(root);

        while(!que.empty())
        {
            depth++;
            int size = que.size();
            for(int i = 0; i < size; i++)
            {
                TreeNode* tmpNode = que.front();
                que.pop();
                if(tmpNode->left) que.push(tmpNode->left);
                if(tmpNode->right) que.push(tmpNode->right);
                if(!tmpNode->left && !tmpNode->right) flag = true;
            }
            if(flag) break;
        }
        return depth;
    }
};

相關文章