二叉树中和为某一值的路径-剑指Offer

二叉树中和为某一值的路径

题目描述

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

思路

  1. 用栈来存储二叉树的路径,遍历到叶子结点就判断是否总和为target,是的话打印,若不是叶子结点,那继续遍历左右子树
  2. 注意:打印完后返回父结点时要弹出栈顶的叶子结点,并且总和减去该值
  3. 注意:打印路径时要遍历栈

代码

import java.util.ArrayList;
import java.util.Stack;
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
        ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
        if (root == null || target == 0) {
        	return list;
        }
        Stack<Integer> stack = new Stack<Integer>();
        int sum = 0;
        find(root, list, stack, sum, target);
        return list;
    }
	public void find(TreeNode root,  ArrayList list, Stack<Integer> stack, int sum, int target) {
		sum += root.val;
		stack.push(root.val);
		
		boolean isLeaf = (root.left == null) && (root.right == null);
	// 如果是叶结点,并且总和等于target
    // 存储该路径
		if ((sum == target) && isLeaf) {
			ArrayList<Integer> intList = new ArrayList<Integer>();
			for (Integer x: stack) {
				intList.add(x);
			}
			list.add(intList);
		}
    // 如果不是叶子结点,遍历左右子结点
		if (root.left != null) {
			find(root.left, list, stack, sum, target);
		}
		if (root.right != null) {
			find(root.right, list, stack, sum, target);
		}
    // 返回父节点之前,在路径上删除当前结点
    // 并在sum中减去该值
		sum -= root.val;
		stack.pop();
	}
}
posted @ 2016-06-29 19:49  RosenDing  阅读(304)  评论(0编辑  收藏  举报