22【题目】输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
*     路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径
* 【思路】只要从根结点到叶结点一条一条遍历;
*      如果到了叶结点,且此路径值跟目标值相同,就添加此路径;
     不是,则从孩子子节点开始查找。

【注】叶结点遍历完后要删除此叶结点值直至返回到父节点。

 package com.exe5.offer;

 import java.util.ArrayList;

 /**
* 22【题目】输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
* 路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径
* 【思路】只要从根结点到叶结点一条一条遍历;
* 如果到了叶结点,且此路径值跟目标值相同,就添加此路径;
不是,则从孩子子节点开始查找。
* @author WGS
*
*/
public class FindTreePath { public static class TreeNode{
int val=0;
TreeNode left=null;
TreeNode right=null;
public TreeNode(int n){
this.val=n;
}
}
public ArrayList<ArrayList<Integer>> getFindPaths(TreeNode root,int target){
ArrayList<Integer> nodeList=new ArrayList<>();
ArrayList<ArrayList<Integer>> pathList=new ArrayList<>();
if(root==null) return pathList;
int currentSum=0;
return findPaths(pathList,nodeList,root,target,currentSum); }
private ArrayList<ArrayList<Integer>> findPaths(ArrayList<ArrayList<Integer>> pathList, ArrayList<Integer> nodeList,
TreeNode root, int target, int currentSum) { currentSum+=root.val;
nodeList.add(root.val);
//如果是叶结点就判断与目标值是否相同,相同则添加此路径
boolean isLeafNode=root.left==null && root.right==null;
if(currentSum==target && isLeafNode==true){
ArrayList<Integer> tempList=new ArrayList<>();
for(Integer val:nodeList){
tempList.add(val);
}
//循环结束为一条路径,加到pathList
pathList.add(tempList);
}
//如果不是叶结点,则使用递归继续判断左右子节点
if(root.left!=null)
findPaths(pathList, nodeList, root.left, target, currentSum);
if(root.right!=null)
findPaths(pathList, nodeList, root.right, target, currentSum); //遍历到叶结点后,要在返回到父节点之前,在路径上删除当前结点
Integer val2=nodeList.remove(nodeList.size()-1);
currentSum-=val2;
return pathList;
} public static void main(String[] args) {
TreeNode root=new TreeNode(10);
TreeNode node1=new TreeNode(5);
TreeNode node2=new TreeNode(4);
TreeNode node3=new TreeNode(7);
TreeNode node4=new TreeNode(12);
root.left=node1;
root.right=node4;
node1.left=node2;
node1.right=node3; //ArrayList<ArrayList<Integer>> getList=new FindTreePath().getFindPaths(root, 22);
ArrayList<ArrayList<Integer>> getList=new FindTreePath().getFindPaths(null, 0);
System.out.println(getList.size()); for (ArrayList<Integer> list : getList) {
for (Integer integer : list) {
System.out.print(integer+" ");
}
System.out.println();
}
} }

剑指offer系列22--二叉树中和为某一值的路径的更多相关文章

  1. 剑指offer 25:二叉树中和为某一值的路径

    题目描述 输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大 ...

  2. 剑指offer系列33-----把二叉树打印成多行

    [题目]从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 方法一:直接打印 package com.exe7.offer; import java.util.LinkedList; i ...

  3. 剑指offer-面试题34-二叉树中和为某一值的路径-二叉树遍历

    /* 题目: 输入一颗二叉树和一个整数,打印从根节点到叶子节点中所有和为该整数的路径. */ /* 思路: 先序遍历,深度遍历. 从树根开始,记录路径之和,遍历到叶子节点,如果和为期望值,则输出. 回 ...

  4. 剑指offer 二叉树中和为某一个值的路径

    剑指offer 牛客网 二叉树中和为某一个值的路径 # -*- coding: utf-8 -*- """ Created on Tue Apr 9 15:53:58 2 ...

  5. 剑指Offer - 九度1368 - 二叉树中和为某一值的路径

    剑指Offer - 九度1368 - 二叉树中和为某一值的路径2013-11-23 03:46 题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结 ...

  6. 【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径

    题目链接地址: http://ac.jobdu.com/problem.php? pid=1368 题目1368:二叉树中和为某一值的路径 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2252 ...

  7. 剑指Offer(二十四):二叉树中和为某一值的路径

    剑指Offer(二十四):二叉树中和为某一值的路径 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...

  8. 剑指 Offer 34. 二叉树中和为某一值的路径

    剑指 Offer 34. 二叉树中和为某一值的路径 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下 ...

  9. 剑指Offer:二叉树中和为某一值的路径【34】

    剑指Offer:二叉树中和为某一值的路径[34] 题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. ...

随机推荐

  1. eclipse关联源码 Failed to create the part's controls

    在eclipse中关联源码时: 1.出现Failed to create the part's controls错误, 2.而attach source 这个按钮却没有出现. 问题原由:eclipse ...

  2. hdu 5187 zhx's contest

    题目分析如果n=1,答案是1,否则答案是2n−2. 证明:ai肯定是最小的或者最大的.考虑另外的数,如果它们的位置定了的话,那么整个序列是唯一的. 那么ai是最小或者最大分别有2n−1种情况,而整个序 ...

  3. Linux启动流程详解

    在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接 ...

  4. Codeforces Round #277 (Div. 2) A B C 水 模拟 贪心

    A. Calculating Function time limit per test 1 second memory limit per test 256 megabytes input stand ...

  5. iOS字符串拆分

    NSString* poStr = @"local-8009-1408082245-8.wav"; NSArray* poArr1 = [naviAddressAndPort co ...

  6. spingmvc 返回json数据日期格式化方法

    第一种: json 用的是这个依赖 <!-- JSON lib 开发包 以及它的依赖包 --> <dependency> <groupId>com.fasterxm ...

  7. tools/build.c

    /* *  linux/tools/build.c * *  Copyright (C) 1991, 1992  Linus Torvalds */ /* * This file builds a d ...

  8. spark-DataFrame之RDD和DataFrame之间的转换

    package cn.spark.study.core.mycode_dataFrame; import java.io.Serializable;import java.util.List; imp ...

  9. 卸载linux自带版本JDK

    1)卸载系统自带的jdk版本:    查看自带的jdk:    #rpm -qa|grep gcj    可能看到如下类似的信息:    libgcj-4.1.2-44.el5    java-1.4 ...

  10. scala言语基础学习十

    类型参数 泛型函数 多个参数 使用泛型参数时候,不给类型scala也能自己判断 上边界bounds 下边界bounds 专门用于打包泛型数组