ningendo

一个简单的二叉树例子来理解递归

一.描述

  一个简单的二叉树的例子,比如求二叉树的所有节点的和

    比如下面这棵树,所有节点的和为  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(子问题或者子集) 。。。

 

posted on 2020-11-27 21:04  Lunamonna  阅读(272)  评论(0编辑  收藏  举报

导航