一个简单的二叉树例子来理解递归
一.描述
一个简单的二叉树的例子,比如求二叉树的所有节点的和
比如下面这棵树,所有节点的和为 1+2+3=6
二.递归法来求解
通过树的结构可以得到解法,即总和为当前节点的和加上左节点的和加上右节点的和
即 Sum = cur.val + cur.left.val + cur.right.val
根据递推法,即可求出所有节点的和
当节点只有2时 , Sum = 2+0+0=2
当节点只有3时 , Sum = 3+0+0=3
算上节点1 就是
1 +
2 + 0 + 0
3 + 0 + 0
= 6
三.具体代码
public class Solution { public static void main(String[] args) { TreeNode r2 = BTUtils.generateTreeNode(new Integer[]{1,2,3}); System.out.println(subNodeSum(r2)); } private static int subNodeSum(TreeNode node){ if(node==null){ return 0; } int val = node.getVal(); return val + subNodeSum(node.getLeft()) + subNodeSum(node.getRight()); } }
输出:6
四:递归的套路
1.分析问题,先看问题的输入是什么,是一个数,一个类的对象还是某一种数据结构?
如果是数据结构,比如链表,图,二叉树,其实都可以看成一个集合,那么都有提供下一个元素的迭代方法
比如上面的二叉树问题,提供了left,right供我们去找下一个元素
比如也可以是一串数字的集合,数组,字符串。或者一个数列。
如果是数列的话,那么需要去分析数列的规律,最好是找到递推公式。
2.分析要输出什么,设计好递归的方法,即内部计算方法,加减乘除,求最值,绝对值等等。。。一般使用递归的,都是一些简单的计算,太复杂的就最好不用递归。
3.找到子问题或者子集,或者子集里的下一个元素 ,调用递归方法,传入下一个值做参数,并和当前值做运算,然后将这个表达式直接返回。
4.设置好跳出递归的条件和值,比如上面的二叉树,节点为空,就返回0,并跳出递归。
def recursion(参数):
if(参数 ==null) return 。。。
return 当前值 + recursion(子问题或者子集) + recursion(子问题或者子集) 。。。