给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 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]