题目描述
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
分析:队树的节点值得求和之类的操作大部分都是基于树的遍历操作的,只要对树的遍历操作稍作变形,基本都能解决问题(个人观点)。我们知道只有树的先序遍历是首先访问根节点的,此题的关键在于如何把树遍历过程中的节点保存下来,把满足条件的路径加入到结果中,不满足条件的路径节点如何进行重新的搜索。当用前序遍历的方式访问到某一节点时,我们把该节点添加到路径上,并累加该节点的值。如果该节点为叶节点并且路径中节点值的和刚好等于输入的数据,则当前路径符合要求,我们把他保存到要返回的结果中,如果当前节点不是叶节点,我们继续访问它的子节点。当前节点访问结束后,递归函数将自动回到它的父节点。因此我们在函数退出之前要在路径上删除当前节点并减去当前节点的值,以确保返回父节点时路径刚好是从跟节点到父节点的路径(参考【剑指offer】一书)。
代码如下所示:
1 import java.util.ArrayList; 2 /** 3 public class TreeNode { 4 int val = 0; 5 TreeNode left = null; 6 TreeNode right = null; 7 8 public TreeNode(int val) { 9 this.val = val; 10 11 } 12 13 } 14 */ 15 public class Solution { 16 public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) { 17 ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>> (); 18 ArrayList<Integer> path = new ArrayList<Integer>() ; 19 search(root ,target,res,path) ; 20 return res ; 21 } 22 private void search(TreeNode root, int target, ArrayList<ArrayList<Integer>> res,ArrayList<Integer> path) { 23 if(root==null){ 24 return ; 25 } 26 target = target - root.val ; 27 if(root.left == null && root.right == null){ 28 if(target == 0){ 29 path.add(root.val); 30 res.add(new ArrayList<Integer>(path)); 31 path.remove(path.size()-1); 32 } 33 return; 34 } 35 path.add(root.val ) ; 36 search(root.left,target,res,path) ; 37 search(root.right,target,res,path) ; 38 path.remove(path.size()-1) ; 39 40 } 41 }
时间: 2024-10-11 23:15:52