Minimum Depth of Binary Tree
- 问题描述:
leetcode 111
错误解法
- 错误思路:分别求左子树的最小深度和右子树的最小深度;然后取两者的最小值加一。
- 代码如下:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
int minDepth(TreeNode* root) {
if (root==NULL) { //递归出口,处理空树,返回0
return 0;
}
else{
int left = minDepth(root->left); //分别计算左右子树的最小深度
int right = minDepth(root->right);
return min(left, right)+1; //取左右子树的最小深度加一就是所要求解的值
}
}
以上算法是错误的: 当图为:
结果为:
错误原因:
如图所示,对于1 的左右子树,左子树的最小深度为1,右子树的最小深度为0;但是结果为2,而不是0+1=1;
正确解法
int min=65535; //定义一个全局变量来记录最小深度
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
void preOrder(TreeNode *root, int level){ //定义一个参数level,为当前层数
if (root!=NULL) {
if (root->right==NULL&&root->left==NULL) { //当当前层的节点为叶子节点,且level小于全局min时,更新min
if (level<min) {
min=level;
}
}
preOrder(root->left, level+1);
preOrder(root->right, level+1);
}
}
int minDepth(TreeNode* root) {
if (root==NULL) {
return 0;
}
preOrder(root, 1); //由于为了能够,多传入一个纪录层数的参数,定义一个函数preOrder函数来添加level参数。
return min;
}
注意点:
- 为了定义一个纪录层数的level,所以minDepth中定义一个函数preOrder来添加level参数
- 递归函数并不是都需要返回值的,比如preOrder, 只是递归遍历树,并没有返回值;(在最大深度中用到的是返回值:http://blog.csdn.net/hellotomhaha/article/details/54955678)
想法:在遍历树的时候,如果用到了全局变量来纪录答案的时候,一般不用返回值的。
递归遍历时,当节点为null时结束;当为叶子节点时需要检验是否需要跟新min