一、题目描述
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
二、解题思路
用递归和二叉树的前序遍历(需要先遍历根节点)。
三、Java代码实现
package jianzhioffer;
import java.util.ArrayList;
class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int val){ this.val = val;}
}
public class FindPath {
public static void main(String[] args){
}
public static ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target){
ArrayList<ArrayList<Integer>> allPath = new ArrayList<ArrayList<Integer>>();
if(root == null) return allPath;
int current = 0;
ArrayList<Integer> path = new ArrayList<Integer>();
FindPath(root, allPath, path, target, current);
return allPath;
}
public static void FindPath(TreeNode root, ArrayList<ArrayList<Integer>> allPath, ArrayList<Integer> path, int target, int current)
{
current +=root.val; //目前路径的长度和
path.add(root.val); //目前路径的队列
boolean isLeaf = (root.left == null) && (root.right == null);
if((current == target) && isLeaf)
{
allPath.add(new ArrayList<Integer>(path));
}
if(root.left != null)
FindPath(root.left, allPath, path, target, current);
if(root.right!= null)
FindPath(root.right, allPath, path, target, current);
//返回父结点之前,在路径上删除当前结点
path.remove(path.size() -1);//这步容易忘
}
}