题目大意:求二叉树的最小深度,即根到最近叶节点的深度
分析:dfs、bfs均可
代码:
自己的代码:bfs
/**
* 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) return 0;
queue<TreeNode*> que;
que.push(root);
int depth = 0;
while(!que.empty()){
depth++;
int size = que.size();
for(int i = 0;i < size;i++){
TreeNode* tmp = que.front();
que.pop();
if(!tmp->left && !tmp->right) return depth;
if(tmp->left) que.push(tmp->left);
if(tmp->right) que.push(tmp->right);
}
}
return depth;
}
};
dfs:dfs一个节点分四种情况:该节点为空,返回0;该节点为叶子结点,返回1;该节点左右子树有一个为空,返回非空子树的深度+1;该节点的左右子树均非空,返回左右子树中较小那个的深度
注意:当某个结点的左右子树只有一个为空时不能和最后一种情况合并,因为此时空子树的深度为0,小于非空子树深度,如果是第四种情况就会返回0,而我们知道该节点的最小深度不是1+0,因为该节点不是叶子结点。
/**
* 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 == NULL) return 0;
if(!root->left && !root->right) return 1;
if(!root->left) return minDepth(root->right)+1;//左子树为空,则只计算右子树深度
if(!root->right) return minDepth(root->left)+1;//右子树为空,则只计算左子树深度
return min(minDepth(root->left), minDepth(root->right)) + 1;
}
};