第一题就翻车了...
求给定二叉树的最小深度。最小深度是指树的根结点到最近叶子结点的最短路径上结点的数量。
分析题目,最短路径。。。。。
1->3为最短路径,同样
1->2->4为最短路径,一开始的思路就错了
class Solution {
public :
int min_path ( TreeNode * root , int n)
{
if ( root == NULL )
return n;
return min ( min_path ( root- > left, n+ 1 ) , min_path ( root- > right, n+ 1 ) ) ;
}
int run ( TreeNode * root) {
if ( root == NULL )
return 0 ;
return min_path ( root, 0 ) ;
}
} ;
节点为空返回作为判定条件只能适用于完全二叉树,对于非完全二叉树就是个错误判定
如此图,子节点不存在作为退出条件的话,在节点2右节点判定的时候直接退出,路径为2。
但实际上退出条件必须是左右都不存在....单节点退出不能解决问题,思路上就错误了。
我的修改
class Solution {
public :
int min_path ( TreeNode * root , int n)
{
if ( root- > left == NULL && root- > right == NULL )
return n;
int l = INT_MAX;
int r = INT_MAX;
if ( root- > left != NULL )
l = min_path ( root- > left, n+ 1 ) ;
if ( root- > right != NULL )
r = min_path ( root- > right, n+ 1 ) ;
return min ( l, r) ;
}
int run ( TreeNode * root) {
if ( root == NULL )
return 0 ;
return min_path ( root, 1 ) ;
}
} ;
将左右两个子节点作为退出条件,问题解决了。
这次没问题了,但是可以更加简化。
帖一下别人的代码吧,我好酸呀....
链接:https: / / www. nowcoder. com/ questionTerminal/ e08819cfdeb34985a8de9c4e6562e724? f= discussion
来源:牛客网
class Solution {
public :
int run ( TreeNode * root) {
if ( ! root)
return 0 ;
int l = run ( root- > left) ;
int r = run ( root- > right) ;
if ( l== 0 || r== 0 )
return 1 + l+ r;
return 1 + min ( l, r) ;
}
} ;
龟龟,还是自身递归的代码好看呀,菜狗子还需要努力。