*一*递归主要考虑问题:
1、返回值
2、一次递归的具体操作
3、边界条件
*二*递归的进阶:
1、利用return语句,实现特殊判断条件(问题的某种情况,可直接判断整体的是和否)下:阻隔中断(起到剪枝的作用)
2、构造自定义类型。可以在return语句中利用自定义类型,实现信息的高度集合,返回语句包含多种信息。
一、高度平衡二叉树的判断:
题源:LeetCode 110:https://leetcode-cn.com/problems/balanced-binary-tree/
1、工作四天,没碰了。一眼看到有点生疏,后来想法是先写出递归方式,再写出非递归方式。
递归代码:(自底向上)
class Solution {
public:
int depth(TreeNode* root){
if(root==NULL) return 0;
return depth(root->left)>depth(root->right)?depth(root->left)+1:depth(root->right)+1;
}
bool isBalanced(TreeNode* root) {
if(root==NULL) return true;
if(abs(depth(root->left)-depth(root->right))>=2) return false;
return isBalanced(root->left)&&isBalanced(root->right);
}
};
主要的思路没有问题。由上自下递归实现,但是出现了超时。主要depth()的return语句有问题,应改为:
return max(depth(root->left,root->right)+1;
之前的方法会无端在一次递归中多调用了两次depth()函数。
时空复杂度分析:
2、自上而下