题目111:Minimum Depth of Binary Tree
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.
题目分析:
重新定义二叉树的最小深度,最小深度指的是从根结点到最近的叶子结点路径上的结点个数(包括根结点和叶子结点)。
1. 递归实现
思路分析1:
分别求出左右子树的最小深度,二者中最小的深度加1,就是该二叉树的最小深度。
error code:
class Solution {
public:
int minDepth(TreeNode* root) {
if (root == 0)
return 0;
return 1 + min(minDepth(root->left), minDepth(root->right));
}
};
error code是因为如果某结点a的左子树为空,右子树非空时,不能取它左右子树中小的作为深度,如果返回结点a左右子树种较小的作为深度,显然会返回0,但这时结点a并不是叶子结点,所以应该返回的是右子树的深度。
AC code:
class Solution {
public:
int minDepth(TreeNode* root) {
if (root == 0)
return 0;
int min_left, min_right;
min_left = minDepth(root->left);
min_right = minDepth(root->right);
if (0 == min_left)
return min_right + 1;
if (0 == min_right)
return min_left + 1;
return 1 + min(min_left, min_right);
}
};
2. 二叉树的广度优先搜索
思路分析2.1:
二叉树的广度优先搜索BFS,也可以成为二叉树的层次遍历,找到第一个叶子结点就返回现在的深度。
广度优先搜索的实现,需要借助队列,关键是如何区分层数增加,这里使用两个vector变量,没有使用queue因为没有clear函数。
class Solution {
public:
int minDepth(TreeNode* root) {
if (root == 0)
return 0;
vector<TreeNode *> que1, que2;
int depth, i;
depth = 1;
que1.push_back(root);
while (!que1.empty()) {
for (i = 0; i < que1.size(); i ++) {
TreeNode *qtop = que1[i];
/* 找到第一个叶子结点就返回当前的深度 */
if (0 == qtop->left && 0 == qtop->right)
return depth;
if (qtop->left)
que2.push_back(qtop->left);
if (qtop->right)
que2.push_back(qtop->right);
}
que1 = que2;
que2.clear();
++ depth;
}
return depth;
}
};
思路分析2.2:
与思路2.1相同,不同的是使用一个队列实现.
class Solution {
public:
int minDepth(TreeNode* root) {
if (root == 0)
return 0;
queue<TreeNode *> que;
que.push(root);
int depth, len, i;
depth = 1;
while (!que.empty()) {
len = que.size();
for (i = 0; i < len; i ++) {
TreeNode *qtop = que.front();
que.pop();
if (0 == qtop->left && 0 == qtop->right)
return depth;
if (qtop->left)
que.push(qtop->left);
if (qtop->right)
que.push(qtop->right);
}
++ depth;
}
return depth;
}
};
参考:
[1] http://www.cnblogs.com/TenosDoIt/p/3440059.html
[2]https://github.com/jingcmu/leetcode/blob/master/C%2B%2B/Minimum%20Depth%20of%20Binary%20Tree.cpp