题目描述
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list
中,数组长度大的数组靠前)
8 / 6 10 /
4 7 18 [8-6-4] [8-10]
解法
在树的前、中、后序三种遍历方式中,只有前序遍历是首先访问根结点的。
所以要按前序的方式来遍历。
步骤:
1. 当用前序遍历的方式访问到某一结点时,把该结点添加到路径上,并累加该结点的值。
2. 如果该结点为叶结点并且路径中结点的值和刚好等于输入的整数,则把它打印出来。
3. 如果当前结点不是叶结点,则继续访问它的子结点。
4. 当前结点访问结束后,递归回到它的父结点。
import java.util.ArrayList; /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { private ArrayList<ArrayList<Integer>> res = new ArrayList<>(); /** * 找出二叉树中和为某一值的路径(必须从根节点到叶节点) * * @param root 二叉树的根结点 * @param target 目标值 * @return 结果list */ public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) { findPath(root, target, new ArrayList<>()); return res; } private void findPath(TreeNode root, int target, ArrayList<Integer> list) { if (root == null) { return; } list.add(root.val); target -= root.val; if (target == 0 && root.left == null && root.right == null) { res.add(new ArrayList<>(list)); } else { findPath(root.left, target, list); findPath(root.right, target, list); } list.remove(list.size() - 1); } }