1. 程式人生 > 其它 >Leetcode第111題 二叉樹的最小深度 C++解法

Leetcode第111題 二叉樹的最小深度 C++解法

技術標籤:二叉樹leetcode二叉樹

DFS解法,遞迴左右,分別求左右子樹深度,然後求最小值。但是一開始沒考慮單邊的情況,直接返回min(left,right)。

class Solution {
public:
    int minDepth(TreeNode* root) {
        if(!root)   return 0;
        int left=minDepth(root->left)+1;
        int right=minDepth(root->right)+1;
        if(left==1||right==1)
        return
left+right-1; return min(left,right); } };

BFS
1、通過雙佇列來實現

class Solution {
public:
    int minDepth(TreeNode* root) {
        vector<queue<TreeNode*> > v;
        queue<TreeNode*> q1;
        queue<TreeNode*> q2;
        v.push_back(q1);
        v.push_back(q2);
int i=0; bool flag=true; TreeNode *pmove=root; v[i].push(pmove); while(flag&&pmove&&!v[i%2].empty()) { while(flag&&!v[i%2].empty()) { pmove=v[i%2].front(); v[i%2].pop(); if
(pmove->left) v[(i+1)%2].push(pmove->left); if(pmove->right) v[(i+1)%2].push(pmove->right); if(!pmove->left&&!pmove->right) flag=false; } ++i; } return i; } };

繼續學習,發現自己還是太菜,不能靈活運用資料結構

class Solution {
public:
    int minDepth(TreeNode* root) {
        queue<pair<TreeNode*,int> > q;
        TreeNode *pmove=root;
        int dep=0;
        q.emplace(pmove,1);
        while(pmove&&!q.empty())
        {
            pmove=q.front().first;
            dep=q.front().second;
            q.pop();
            if(pmove->left)
            q.emplace(pmove->left,dep+1);
            if(pmove->right)
            q.emplace(pmove->right,dep+1);
            if(!pmove->right&&!pmove->left)
                break;
        }
        return dep;
    }
};

繼續優化

class Solution {
public:
    int minDepth(TreeNode* root) {
        queue<TreeNode*> q;
        TreeNode *pmove=root;
        int dep=0;
        q.push(pmove);
        while(pmove&&!q.empty())
        {
            int size=q.size();
            dep++;
            for(int i=0;i<size;++i)
            {
                pmove=q.front();
                q.pop();
                if(pmove->left)
                q.emplace(pmove->left);
                if(pmove->right)
                q.emplace(pmove->right);
                if(!pmove->right&&!pmove->left)
                    return dep;
            }
        }
        return dep;
    }
};