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系列33-----把二叉树打印成多行

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

  2. 剑指Offer面试题:23.二叉树中和为某一值的路径

    一.题目:二叉树中和为某一值的路径 题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.例如输入下图中二叉树和整数2 ...

  3. 剑指offer——已知二叉树的先序和中序排列,重构二叉树

    这是剑指offer中关于二叉树重构的一道题.题目原型为: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2, ...

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

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26141815 题目描写叙述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数 ...

  5. 剑指Offer:面试题25——二叉树中和为某一值的路径(java实现)

    问题描述: 输入一棵二叉树和一个整数,打印出二叉树中结点指的和为输入整数的所有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.二叉树结点的定义如下: public class Tree ...

  6. 剑指offer系列34----按之字形顺序打印二叉树

    [题目]请实现一个函数按照之字形打印二叉树, * 即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印, * 其他行以此类推. 未优化,不是最优解,博主用的是队列 ...

  7. 剑指offer系列32-----对称二叉树的判断

    [题目]请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. package com.exe7.offer; /** * [题目]请实现一个函 ...

  8. 剑指offer系列20--从上到下打印二叉树

    * 20 [题目]从上往下打印出二叉树的每个节点,同层节点从左至右打印. * [思路]从根结点开始,先保存结点,再看根结点的左右结点有没有值. * 有,就将左右值放到集合中: * 根节点输出后,打印根 ...

  9. 剑指Offer 二叉树中和为某一值的路径(dfs)

    题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.     思路: 递归,然后深搜,因为题目定义的, ...

随机推荐

  1. qam 64的设计

    module qam64(x,out,clk,clk1,rst);input x,clk,clk1,rst;output [18:0] out;reg [2:0] count;reg [5:0] re ...

  2. 杂项之pymysql连接池

    杂项之pymysql连接池 本节内容 本文的诞生 连接池及单例模式 多线程提升 协程提升 后记 1.本文的诞生 由于前几天接触了pymysql,在测试数据过程中,使用普通的pymysql插入100W条 ...

  3. Java程序的编码规范

    所有的程序开发手册都包含了各种规则.一些习惯自由程序人员可能对这些规则很不适应,但是在多个开发人员共同写作的情况下,这些规则是必需的.这不仅仅是为了开发效率来考虑,而且也是为了后期维护考虑. 一.命名 ...

  4. PHP Web Shell in browser

    /************************************************************************************* * PHP Web She ...

  5. POJ3154 Graveyard

    Graveyard Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1654   Accepted: 840   Specia ...

  6. RTP/RTCP的时间同步机制

    转自:http://blog.csdn.net/leesphone/article/details/5571972 RTP支持传送不同codec的steaming,不同codec的clock rate ...

  7. Opencv创建有滚动条的视频

    #include "stdafx.h"#include "cv.h"#include "cxcore.h"#include "hi ...

  8. 【BZOJ-3172】单词 AC自动机

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2567  Solved: 1200[Submit][Status ...

  9. Android——模拟文件拷贝

    模拟文件拷贝:要求:要用progressDialog和子线程来模拟显示拷贝进度:进度完成后在主界面提示拷贝完成,分别使用普通方式和消息机制编写. layout文件: <?xml version= ...

  10. SmartWeatherAPI_Lite_WebAPI C# 获取key加密

    中国气象局面向网络媒体.手机厂商.第三方气象服务机构等用户,通过 web 方式提供数据气象服务的官方载体. 在一周前已经申请到appid,但是苦于没有C#版的key 的算法,一直验证不通过,经过几天查 ...