问题:给定二叉树,找到它的最小深度。最小深度是沿从根节点到最近的叶节点的最短路径上的节点数。
分析:本题要注意最小深度与最大深度的区别:对于最大深度,不需要考虑当前子树是否为单子树(即一侧子树深度为0)的情况,即最大深度一直等于左右子树的最大值;对于最小深度,需要考虑当前子树是否为单子树的情况,对于双子树,其最小深度为左右子树的最小值,对于单子树,其最小深度为左右深度的最大值(因为有一侧的子树为0)
递归:
若左子树为空,则返回右子树的最小深度+1;(加1是因为要加上根这一层)
若右子树为空,则返回左子树的最小深度+1;
若左右子树均不为空,则取左、右子树最小深度的较小值,+1;
class Solution{
public:
int run(TreeNode*root)
{
if(root == NULL)
return 0;
else if(root->left)
return run(root->right)+1;
else if(root->right)
return run(root->left)+1;
int depthLeft,depthRight;
depthLeft = run(root->left);
depthRight = run(root->right);
return (depthLeft < depthRight)? (deptthLeft+1):(depthRight+1);
}
}
层序遍历(广度优先),一层一层的遍历,直到遇到第一个叶子节点,则得到最短的深度
class Solution {
public:
typedef TreeNode* tree;
int run(TreeNode *root) {
if(root == NULL)
return 0;
int level,size;
tree now,last;
now = last = root;
queue<tree>qu;
level = 1;
qu.push(root);//root入队
while(qu.size())
{
now = qu.front();
qu.pop();
size = qu.size();
if(now->left)
qu.push(now->left);
if(now->right)
qu.push(now->right);
if(size == qu.size())//若入队的now没有左右节点,条件成立找到第一个叶子节点
break;
if(last == now)//last总是指向每层的最后一个,若相等则这一层完,换下一层
{
level++;
last = qu.back();
}
}
return level;
}
};
督促自己,不敢在懒了!!!