513:
用层序遍历(BFS)能比较简单地写出来,用递归确实有点绕。
目前为止一直在写有返回值的递归,所以一开始还是在想该怎么让递归最后返回的是符合条件的值。但其实像这种找符合特定条件并且在特殊位置的值可以引入全局变量来减轻递归方程的负担,只让其遍历检查更新就好,不需要返回。
这道题一个重点是base case和其中的数值更新条件要写对,另一个是深度加减只在检查完左/右子节点不为空并且开始继续往下走的时候才发生,换句话说就是当前深度加减要写在花括号里面。
112:
乍一看不难,其实藏了很多关键的易错点。
首先就是base case,我只想到了当在叶子节点且sum为0时return true,没有想到在叶子节点而sum不为0时应该return false,这样会让代码运行效率高一点。
其次就是对于return值是boolean的递归方程的运用。在每一层的处理逻辑上都涉及到call递归方程自己来开始查找下一层,因为返回值是boolean,所以如果下一层的查找结果是true,应该直接就地返回true,不然就会因为没有返回而漏掉有效的路径。
再者就是对于值的运算。我一开始是在base case前就直接减去当前节点的值(因为也包含了根节点),再在返回上一层的时候加回子节点的值,这样弄错了一个关键点:把手动回溯和让每层递归自动回溯混合使用了。
在这个版本里,我在basecase前就使sum减去当前节点的值(这是令递归自动回溯),却又在下面的if判断里手动加回了子节点的值(手动回溯),这样一混用就导致sum的值总是错的。
113:
上一题的进阶版,在原来代码的基础上要维护path数组(代表一条路径),在符合条件时把path数组放进result数组里。
需要注意在主方程里记得加入根节点,还有把path加入result的时候要记得new一个path的copy,要不然会被空数组覆盖。
105、106:
感觉很难。看题解能理解大概的意思,但代码实现还是遇到了很多困难。
自己最后写出来的做法是每次递归都分4个子数组出来,代表两种遍历方式的两个子树,但是这样很浪费时间和空间。
题解里更有效率的记录下标的方法,跟着做的时候被绕晕了...... 看了一个多小时越看越看不明白,能理解整体思路但是下标的各种计算实在是绕糊涂了......