Leetcode第111題 二叉樹的最小深度 C++解法
阿新 • • 發佈:2021-02-07
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;
}
};