leetcode 二叉树中和为某一值的路径

1.题目

2.解决方案


1.题目

二叉树中和为某一值的路径

         力扣

2.解决方案

        递归+回溯

代码如下

 /**
     * Definition for a binary tree node.
     * public class TreeNode {
     * int val;
     * TreeNode left;
     * TreeNode right;
     * TreeNode() {}
     * TreeNode(int val) { this.val = val; }
     * TreeNode(int val, TreeNode left, TreeNode right) {
     * this.val = val;
     * this.left = left;
     * this.right = right;
     * }
     * }
     */

    /*
     *          5
     *       4      8
     *    11      13  4
     *  7    2       5  1
     *    22
     *  5 4  11 2
     *  5 8  4 5
     * */

    static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode() {
        }

        TreeNode(int val) {
            this.val = val;
        }

        TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }

    public static List<List<Integer>> pathSum(TreeNode root, int targetSum) {

        List<List<Integer>> allList = new ArrayList<>();
        LinkedList<Integer> list = new LinkedList<>();

        Dfs(root, 0, targetSum, list, allList);
        return allList;
    }

    /**
     * @Description:
     * @param root 树根路劲
     * @param sum 当前累加和
     * @param targetSum 目标和
     * @param list 目标和
     * @Date: 2021/9/22 14:06
     * @Author: fuguowen
     * @Return
     * @Throws
     */
    public static void Dfs(TreeNode root, int sum, int targetSum, LinkedList<Integer> list, List<List<Integer>> allList) {
      if(root==null){
          return ;
      }
      //先添加元素,然后判断边界条件
      sum+=root.val;
      list.addLast(root.val);
      if(root.left==null && root.right==null){
          if(sum==targetSum){
              allList.add(new ArrayList<>(list));
          }
          list.removeLast();
          return ;
      }
      Dfs(root.left,sum,targetSum,list,allList);
      Dfs(root.right,sum,targetSum,list,allList);
      //回溯,删除对应的元素
      list.removeLast();

    }



    public static void main(String[] args) {
        TreeNode treeNode1 = new TreeNode(5);
        TreeNode treeNode2 = new TreeNode(4);
        TreeNode treeNode3 = new TreeNode(8);
        TreeNode treeNode4 = new TreeNode(11);
        TreeNode treeNode5 = new TreeNode(13);
        TreeNode treeNode6 = new TreeNode(4);
        TreeNode treeNode7 = new TreeNode(7);
        TreeNode treeNode8 = new TreeNode(2);
        TreeNode treeNode9 = new TreeNode(5);
        TreeNode treeNode10 = new TreeNode(1);

        treeNode1.left = treeNode2;
        treeNode1.right = treeNode3;
        treeNode2.left = treeNode4;
        treeNode4.left = treeNode7;
        treeNode4.right = treeNode8;
        treeNode3.left = treeNode5;
        treeNode3.right = treeNode6;
        treeNode6.left = treeNode9;
        treeNode6.right = treeNode10;

        List<List<Integer>> lists = pathSum(treeNode1, 22);
        for (List<Integer> list : lists) {
            System.out.println(list.toString());
        }


    }

我是厚积薄发,欢迎大家给我点赞,欢迎留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值