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

##题目描述
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
##解题思路
1,从根节点开始,分别向左右递归寻找
2,如果当前路径值刚好相等并且刚好到达叶子节点,则把路径添加到list里
3,如果当前路径值小于目标值,就向左子树或者右子树进发
4,如果当前路径值和大于目标值或者已经找到一条路径则回到上一层
##代码

/**
 * 
 */
package offerTest;

import java.util.ArrayList;

/**
 * <p>
 * Title:FindPaths
 * </p>
 * <p>
 * Description:
 * </p>
 * 
 * @author 田茂林
 * @data 2017年8月20日 下午9:56:48
 */
public class FindPaths {
	ArrayList<ArrayList<Integer>> listall = new ArrayList<ArrayList<Integer>>();
	//发现路径函数
	public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		if (root == null) {
			return listall;
		}
		int cursum = 0;
		return FindPath(root, target, list, cursum);
	}
    //递归调用,存储有效路径
	public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target,
			ArrayList<Integer> list, int cursum) {
		cursum += root.val;
		list.add(root.val);
		// 如果刚好相等,将该路径添加到路径集里
		if (cursum == target && root.left == null && root.right == null) {
			ArrayList<Integer> path = new ArrayList<Integer>();
			for (int i = 0; i < list.size(); i++) {
				path.add(list.get(i));
			}
			listall.add(path);

		}
		// 如果小于当前值,且左子树不为空,则向左子树进发
		if (cursum < target && root.left != null) {
			FindPath(root.left, target, list, cursum);
		}
		// 如果小于当前值,且右子树不为空,则向右子树进发
		if (cursum < target && root.right != null) {
			FindPath(root.right, target, list, cursum);
		}
		//如果当前路径值和大于目标值或者已经找到一条路径则回到上一层
		cursum -= root.val;
		list.remove(list.size() - 1);
		return listall;

	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

全部评论

相关推荐

找工作勤劳小蜜蜂:自我描述部分太差,完全看不出想从事什么行业什么岗位,也看不出想在哪个地区发展,这样 会让HR很犹豫,从而把你简历否决掉。现在企业都很注重员工稳定性和专注性,特别对于热爱本行业的员工。 你实习的工作又太传统的it开发(老旧),这部分公司已经趋于被淘汰,新兴的互联网服务业,比如物流,电商,新传媒,游戏开发和传统的It开发有天然区别。不是说传统It开发不行,而是就业岗位太少,基本趋于饱和,很多老骨头还能坚持,不需要新血液。 工作区域(比如长三角,珠三角,成渝)等也是HR考虑的因素之一,也是要你有个坚定的决心。否则去几天,人跑了,HR会被用人单位骂死。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务