题目要求:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意:要从根节点到叶节点才算是路径,半途不算)
思路:二叉树只有前序遍历是先访问根节点的,所以我们用前序遍历来遍历二叉树,然后我们用栈来存储路径节点,当遍历到某一节点时,把该节点添加到路径上,如果符合题意,则打印该路径,若当前节点不是叶节点,则使用递归继续遍历,当前节点访问结束后,递归函数将自动返回到父节点,因此我们要删除栈中的子节点。
import java.util.ArrayList;
import java.util.Stack;
/*经典的递归求解:1.如果当前节点为叶节点且路径和为目标值,则将栈里的元素添加到list列表里,然后将list添加到路径列表2.否则,对该节点的左右节点分别在进行判断,3.返回父节点时,要将当前加入栈的子节点删除。 */
public class Solution {
public ArrayList<ArrayList<Integer>> FindPath(TreeNode
root,int target) {
ArrayList<ArrayList<Integer>> listPath = new ArrayList<ArrayList<Integer>>();
if (root == null)
return listPath;
Stack<Integer> stack = new Stack<Integer>();
path(root, target, stack,listPath);
return listPath;
}
public void path(TreeNode root, int target,
Stack<Integer> stack,
ArrayList<ArrayList<Integer>> listPath) {
if (root == null)
return;
target -= root.val; //目标值减去节点值是为了方便递归继续使用target变量
stack.push(root.val);//先把元素入栈
if (target == 0 && root.left == null && root.right
== null){ //当前节点为叶节点且满足路径和的值
ArrayList<Integer> list = new
ArrayList<Integer>();
for (int i : stack) //java里栈是可以遍历的,且遍历顺序与入栈顺序一致
list.add(i);
listPath.add(list);
}
if (root.left != null)
path(root.left, target, stack,listPath);
if (root.right != null)
path(root.right, target, stack,listPath);
stack.pop();//该层递归结束,在返回上层递归时要删除子节点。
}
}