什么是递归函数?函数内调用自己的函数叫递归函数。
情况一:只有一个递归函数
递归函数内包括:
1. 终止条件+返回值 (一般是null或0)
2. 调用递归函数(下一层递归/孩子们的事)
3. 在当前节点的操作或判断
4. 返回值
2和3的顺序按需确定。
情况二:两个函数,主函数调用递归函数
- 主函数(for 头节点root):
1)corner case
2)调用递归函数,处理左右子树(root.left, root.right)
- 递归函数:
1)终止条件:在当前节点所作的操作(如修改当前节点的值或link)或判断(如if (…) return value or true/false)
2)当前节点做不了的,继续递归,交给下一层处理(孩子们的事):左右子树也可以mix,如:比较 左节点的左孩子 和 右节点的右孩子 && 比较 左节点的右孩子 和 右节点的左孩子
private boolean isSymmetric(TreeNode t1, TreeNode t2) {
if (t1 == null && t2 == null) return true;
if (t1 == null || t2 == null) return false;
if (t1.val != t2.val) return false;
return isSymmetric(t1.left, t2.right) && isSymmetric(t1.right, t2.left);
t1, t2是当前节点,t1.left, t2.right,t1.right, t2.left是当前节点的左右子树。
3)返回值:按需处理来自下层递归的结果(左右子树的结果),如&& or || or +1,返回上层