链接:maximum-depth-of-binary-tree
题目描述:
求解二叉树的最大深度,具有最优子结构性质,属于动态规划的范畴,常规的思路就是使用递归来求解。
为了追求代码的简洁性,我想到了运用三元表达式,第一遍书写的代码如下:
public static int maxDepth(TreeNode root){
if(root == null){
/*
* 终止条件:遍历到了叶子结点的左右空引用中
*/
return 0;
}
}else{
return maxDepth(root.left)>maxDepth(root.right)?maxDepth(root.left)+1:maxDepth(root.right)+1;
}
这段代码通过了37/39个测试用例,在面对一个比较大的二叉树时,表示超时。而题解的代码如下:
public static int maxDepth(TreeNode root){
if(root == null){
/*
* 终止条件:遍历到了叶子结点的左右空引用中
*/
return 0;
}
else{
int leftDepth = maxDepth(root.left);
int rightDepth = maxDepth(root.right);
if(leftDepth >= rightDepth){
return leftDepth + 1;
}else{
return rightDepth + 1;
}
}
}
两段代码的差异并不大,那么为什么我的代码会导致超时呢?
经过思考,我得到的结论大致如下:
因为我没有对三元表达式前面求得的maxDepth(root.left)与maxDepth(root.right)的数值进行存储,导致计算得出哪一个更大后,需要返回数值时,后面的maxDepth(root.left)+1与maxDepth(root.right)+1又进行了一遍递归计算。
这样的代码使得时间加了一倍,最终导致超时。
按照题解进行修改后,得到的性能表现如下:
内存消耗与其它提交相比略显逊色,我大概思考了一下,能否将leftDepth与rightDepth放到else外面去,这样免去了每次重新定义,修改后第三遍的代码如下:
public static int maxDepth(TreeNode root){
int leftDepth;
int rightDepth;
if(root == null){
/*
* 终止条件:遍历到了叶子结点的左右空引用中
*/
return 0;
}
else{
leftDepth = maxDepth(root.left);
rightDepth = maxDepth(root.right);
if(leftDepth >= rightDepth){
return leftDepth + 1;
}else{
return rightDepth + 1;
}
}
}
显示内存消耗有所降低,不过耗时又变多了一些:
以上问题值得注意,以后遇到可以考虑类似的方法来解决。