路径总和II

给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。

说明: 叶子节点是指没有子节点的节点。

示例:
给定如下二叉树,以及目标和 sum = 22

              5
             / \
            4   8
           /   / \
          11  13  4
         /  \    / \
        7    2  5   1

返回:

[
   [5,4,11,2],
   [5,8,4,5]
]
通过此题掌握二叉树的知识和递归以及JAVA泛型的运用

题目分析:

给定一棵二叉树和目标和,找到所有从根结点到叶子结点的路径总和等于目标和的路径;我之前写过一篇博客路径总和,其中给定一棵二叉树和目标和,只需要判断是否存在一条路径使其路径总和等于目标和;而此题,需要将所有满足的路径输出。

根据返回的结果可以看出,结果的格式是List中包含List,可以通过JAVA泛型解决。

我们利用递归,如果左子树和右子树为空,如果根节点值等于目标和,则将根节点加入列表;如果左子树不为空,对左子树遍历;如果右子树不为空,对右子树遍历。

代码实现:

public List<List<Integer>> pathSum(TreeNode root, int sum)
{
   List<List<Integer>> list = new ArrayList<>();
   List<Integer> temp = new ArrayList<>();

   if (root == null)
       return list;

   getPass(list,temp,sum,0,root);

   return list;

}

public void getPass(List<List<Integer>>list, List<Integer>temp, int sum, int target,TreeNode root)
{
   if (root.left == null && root.right == null)
   {
       if (target + root.data == sum)
       {
           temp.add(root.data);
           list.add(new ArrayList<Integer>(temp));
           temp.remove(temp.size() - 1);
       }
   }

   else
   {
       if (root.left != null)
       {
           temp.add(root.data);
           getPass(list,temp,sum,target+root.data,root.left);
           temp.remove(temp.size() - 1);
       }

       if (root.right != null)
       {
           temp.add(root.data);
           getPass(list,temp,sum,target+root.data,root.right);
           temp.remove(temp.size() - 1);
       }
   }

}

我们采用 List<List> list = new ArrayList<>(); List temp = new ArrayList<>();

两条语句,运用JAVA泛型,list里面存放的类型是List,temp里面存放的是int整数;这样就解决了输出格式的问题。

主函数:

public static void main(String[] args)
{
   TreeNode p = new TreeNode(5);
   p.left = new TreeNode(4);
   p.right = new TreeNode(8);
   p.left.left = new TreeNode(11);
   p.right.left = new TreeNode(13);
   p.right.right = new TreeNode(4);
   p.left.left.left = new TreeNode(7);
   p.left.left.right = new TreeNode(2);
   p.right.right.left = new TreeNode(5);
   p.right.right.right = new TreeNode(1);

   Tree6 t = new Tree6();

   List list = t.pathSum(p,22);
   for (int i = 0; i < list.size(); i++)
   {
       System.out.print(list.get(i) + " ");
   }
}

运行结果:

[5, 4, 11, 2]
[ 5, 8, 4, 5]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值