输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径
解题思路
使用递归可以解决这个问题:
- 前序递归遍历树,途中把结点加入路径
- 如果遍历到叶子结点,则比较当前路径的和是否符合预期值
- 符合条件,将当前路径加入结果集
- 不符合条件,不作任何操作
- 因为使用的是前序遍历,所以每一轮递归都会返回父结点,所以当前保存路径也应该弹出当前结点
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;
}
findPath(root, target);
return listAll;
}
public void findPath(TreeNode node, int target) {
// 先将当前值放入路径
list.add(node.val);
target -= node.val;
// 如果当前结点已经是叶子结点,并且符合条件,则将当前路径加入结果集
if(target == 0 && node.left == null && node.right == null) {
listAll.add(new ArrayList<>(list));
}
// 继续向左子树遍历
if(node.left != null) {
findPath(node.left, target);
}
// 继续向右子树遍历
if(node.right != null) {
findPath(node.right, target);
}
// 本轮结束,从路径中弹出当前结点
list.remove(list.size() - 1);
}
}
相关文章
暂无评论...