题目描述
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22,
返回:
[[5,4,11,2],[5,8,4,5]]
分析
深度搜索从根节点到叶节点的路径,检查各路径上所有节点的值的和是否等于sum。
使用何种数据结构存储遍历路径上的点?
如何判断一个节点为叶节点,当遍历到叶节点时应该做什么?
思路:
- 从根节点深度遍历二叉树,先序遍历时,将该节点存储至path栈中,使用path_value记录累加和;
- 当遍历至叶节点时,检查path_value是否等于sum,若相等则将path中的元素加入result列表中。
- 在后续遍历时,将该节点从path栈中弹出,path_value减去该节点的值。
public void preorderPrint(TreeNode head,int sum,int pathSum,List<List<Integer>> result,Stack<Integer> stack){
if(head==null)
return;
pathSum+=head.val;
stack.push(head.val);
if(head.left==null&&head.right==null&&pathSum==sum) {
List<Integer> li=new ArrayList<>();
for(int i=0;i<stack.size();i++) {
li.add(stack.get(i));
}
result.add(li);
}
preorderPrint(head.left,sum,pathSum,result,stack);
preorderPrint(head.right,sum,pathSum,result,stack);
pathSum-=head.val;
stack.pop();
}
public List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>> result=new ArrayList<>();
int pathSum=0;
Stack<Integer> stack=new Stack<>();
preorderPrint(root, sum, pathSum, result, stack);
return result;
}