题目描述:
Given a binary tree, find its minimum depth.The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node。
给定一棵二叉树,找到它的最小深度。最小深度是沿着从根节点到最近叶节点的最短路径的节点数量。
深度优先(需要遍历每一个结点):
思路:
- 左右子树都为空,则返回0;
- 左子树或右子树为空,返回非空子树深度加一;(加一,是因为要加根节点)
- 左右子树都不为空,则返回左右子树深度较小的一边并且加一;
方法一:
class Solution {
public:
int run(TreeNode *root) {
if(root == NULL)
{
return 0;
}
if(root->left == NULL)//左子树为空的情况
{
return run(root->right) + 1;
}
if(root->right == NULL)//右子树为空的情况
{
return run(root->left) + 1;
}
int left = run(root->left);//左右子树都存在的情况
int right = run(root->right);
return (left < right) ? (left +1) : (right +1);
}
};
方法二:
class Solution {
public:
int run(TreeNode *root) {
if(root == NULL)
{
return 0;
}
int left = run(root->left);
int right = run(root->right);
return (left == 0 || right == 0) ? right+left+1 : min(left,right)+1;
}
};
层次遍历(找到第一个叶子结点):
思路:使用结点指针now、last;now指向当前结点,判断是否有左右孩子;last指向每一层的最后一个结点;当now等于last时,表示一层编译完,这个时候树地深度加一;当遇到第一个没有左右孩子的结点时,就说明这个叶子结点是到根节点的最短路径的结点数量;
class Solution {
public:
int run(TreeNode *root) {
if(root == NULL)
{
return 0;
}
queue<TreeNode *> q;
TreeNode* now;//指向当前结点
TreeNode* last;//指向每一层的最后一个结点
now = last = root;
int size = -1;
int depth = 1;//深度
q.push(root);
size = q.size();
while(q.size())//队列中有结点
{
now = q.front();
q.pop();
size = q.size();
if(now->left)//如果存在左子树
{
q.push(now->left);
}
if(now->right)//如果存在右子树
{
q.push(now->right);
}
if(q.size() - size == 0)//左右子树都不存在,找到叶子结点
{
break;
}
if(now == last)//表示这一层查找完毕
{
depth++;
last = q.back();//重置last
}
}
return depth;
}
};