题目
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
分析
首先,这道题就是要从根节点杀到叶子结点,所以我们从遍历的算法上,并没有什么好优化的地方
其次,这道题要求存的是每条路径,这就意味着,我们要用一种回溯,不管找到还是没找到,我们的路径都要可以回到前面的结点
代码
List<List<Integer>> path = new ArrayList<>(); //记录总的结果
public List<List<Integer>> pathSum(TreeNode root, int sum) {
LinkedList<Integer> list = new LinkedList(); //涉及频繁的增加、删除操作 我们选用linkedList
pathSearch(root,sum,list);
return path;
}
public void pathSearch(TreeNode node,int sum,LinkedList<Integer> list){
if (node==null)
return;
sum -= node.val;
if (node.left==null&&node.right==null){ //到了叶子结点 如果sum==0 说明符合要求
if (sum==0){
list.addLast(node.val);
path.add(new ArrayList<>(list));
list.pollLast(); //注意要将其弹出
}
return; //不管是否符合要求 到了叶子结点就应该结束 回溯到上一个结点
}
list.addLast(node.val);
pathSearch(node.left,sum,list);
pathSearch(node.right,sum,list);
list.pollLast(); //注意要将其弹出 注意是左右结点都搜寻过的了 所以可以放心的弹出 这样存放路径的最后一个结点就会回退到上一个
}