力扣 563 二叉树的坡度

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

   说实话,碰到递归的题我还是挺害怕的,我不太清楚递归的传参,不知道什么时候返回,不知道返回类型,反正就是啥也不知道。今天借着这道题来帮助我理解一下递归。
   首先可以根据样例的解释得出我们需要从下往上算,所以我们需要先递归到叶子节点,按照我们的习惯就是先左子树再右子树。所以需要先递归左子树,再递归到右子树。然后就是考虑下要传的参数和递归函数的返回值。我们先需要明确一些东西, 对于计数类型的递归,我们有两种传参和返回的方式。如果想在传参的时候就将计数器传进去,那我们就不需要返回值,从根结点递归到左右孩子计数器需要增加;如果不想在传参的时候将计数器放进去,那就需要返回值,我们需要先定义个全局变量,递归到叶子节点后一步一步往上返回,在返回的时候全局变量增加。 一般的递归其实就是这样写的。
   这道题需要我们从下往上返,所以需要返回值,传参不用传计数器。虽说下边的count和findAll的传参,返回类型啥的都一样,但是一般还是习惯新写一个方法来完成功能。

class Solution {
    
    
    int ans=0;
    public int findTilt(TreeNode root) {
    
    
        count(root);
    	return ans;
    }
    public int count(TreeNode root) {
    
    
    	if(root==null)
    		return 0;
    	int left=count(root.left);
    	int right=count(root.right);
    	ans+=Math.abs(left-right);
    	return left+right+root.val;
    }
}

   按照上边说的,需要返回值,所以返回值是int,需要个全局变量来计数,就是ans。然后就是需要从下到上递归,所以先要一直递归到叶子节点,然后计数器增加的就是左孩子-右孩子的绝对值。当到这里说明这个结点的坡度算完了,接下来就是返回值,根据例二的结点4的坡度我们可以得出我们需要左右孩子的所有结点的和。
   接下来就来走一遍示例二了解一下整个过程:
在这里插入图片描述

      先一路走左孩子,3的左右孩子都为null,ans+=0,返回3,这个时候退回到2,走2的右孩子5,5的左右孩子也为null,所以ans+=0,返回5,这个时候2的左右孩子都遍历完了,ans+=abs(3-5)=2,返回3+5+2=10,接下来到了4的右孩子9,9先找左孩子为null,返回0,然后到9的右孩子7,然后7的左右孩子都为null,ans+=0=2,返回0+0+7=7,然后到9,ans+=abs(0-7)=7,返回0+7+9=16,返回到4,ans+=abs(10-16)=6,返回10+16+4。最后得到的ans就是15.
   我觉得整个过程最容易想不到的就是最后return的是left+right+root.val,但其实我们观察样例就能发现样例其实已经给了提醒,所以以后做题需要好好分析下样例,看看样例是怎么走的,跟着它的过程来。

猜你喜欢

转载自blog.csdn.net/weixin_51656756/article/details/121407075