题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如输入整数22 和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12 和10, 5, 7。
二元树节点的数据结构定义为:
struct BinaryTreeNode // a node in the binary tree
{
int value; // value of node
BinaryTreeNode *left; // left child of node
BinaryTreeNode *right; // right child of node
};
思路:
1.前序遍历,边遍历边添加到路径
2.target减去val
3.如果没有子节点,并且target==0,说明满足条件,将路径添加到结果中
4.查找左子树,查找右子树
5.回退的同时,从路径中删除本次的节点
<pre name="code" class="java">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>> listAll = new ArrayList<ArrayList<Integer>>();
private ArrayList<Integer> list = new ArrayList<Integer>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root == null)
return listAll;
list.add(root.val);
target -= root.val;
if(target == 0 && root.left == null && root.right == null)
listAll.add(new ArrayList<Integer>(list)); //子节点满足条件就添加
FindPath(root.left, target);
FindPath(root.right, target);
list.remove(list.size()-1); //回退需要删除一个元素
return listAll;
}
}