7.15 第一次做,无法 AC
7.16 不能一次 AC
7.17 差一点点 AC
7.18 一次 AC

题目描述


原题链接:https://leetcode-cn.com/problems/er-cha-shu-zhong-he-wei-mou-yi-zhi-de-lu-jing-lcof/

解题思路:回溯法:先序遍历+路径记录


K 神题解:https://leetcode-cn.com/problems/er-cha-shu-zhong-he-wei-mou-yi-zhi-de-lu-jing-lcof/solution/

  • 特别的:

    • K 神并没有正面直接去计算路径和然后与 target 进行比较;
    • 而是变相的用 target 减去每一个路过的节点值,当 target 为0的时候,若此时到达的是叶子节点(root.left == null && root.right ==null),则就侧面表明此时的路径和就是为 targret !如果到达叶子节点了,但是 target 的值还没减到0,则路径和就肯定不是 target 了!
  • 心得:做二叉树遍历题时,要懂得抓住遍历到叶子节点时的特性与所求题目进行结合,不一定要正面解决问题,可以从侧面解决!

7.16 心得:

  • 这是处理业务的递归回溯,不是判断对错的递归回溯!
  • 处理业务:所以终止条件就只需要写本题持续不了的情况,也就是当前节点为 null,就没办法继续了。
  • 然后再结合因为是二叉树的先序遍历,所以接下来就是“对当前节点干什么”的环节!

  • 这题因为返回值比较复杂,所以最后把要返回的变量定义为全局的,然后在原方法进行返回,并且再写一个递归函数去遍历二叉树,将得到的结果加到全局变量的结果集里面就行了,这样就简单很多了,也不用耦合在一个方法里面,重新写的递归函数甚至返回值直接写成 void 就行了,因为不用你返回啥!

    1. class Solution {
    2. LinkedList<List<Integer>> res = new LinkedList<>();
    3. LinkedList<Integer> path = new LinkedList<>();
    4. public List<List<Integer>> pathSum(TreeNode root, int target) {
    5. recur(root,target);
    6. return res;
    7. }
    8. public void recur(TreeNode root, int target) {
    9. if(root == null) return;
    10. path.add(root.val);
    11. target -= root.val;
    12. if(target == 0 && root.left == null && root.right == null) {
    13. // 这里传进去的 path 必须重新 new 一个,相当于保存一个快照
    14. // 如果不重新 new 一个,显而易见的,因为 path 对象只有最开始定义的那一个
    15. // 最后 res 结果集保存的就都是一样的 path 了!而且最致命的是,都为空!
    16. res.add(new LinkedList(path));
    17. }
    18. recur(root.left, target);
    19. recur(root.right, target);
    20. path.removeLast();
    21. }
    22. }