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

简介: 剑指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
  }
}


相关文章
【剑指offer】-二叉树中和为某一值的路径-24/67
【剑指offer】-二叉树中和为某一值的路径-24/67
|
6月前
代码随想录Day15 二叉树 LeetCodeT513 找树左下角的值 T112路径总和 T106 从中序和后序遍历构造二叉树
代码随想录Day15 二叉树 LeetCodeT513 找树左下角的值 T112路径总和 T106 从中序和后序遍历构造二叉树
25 0
|
6月前
|
算法
代码随想录Day14 LeetCodeT110平衡二叉树 T257二叉树的所有路径 T404 左叶子之和
代码随想录Day14 LeetCodeT110平衡二叉树 T257二叉树的所有路径 T404 左叶子之和
20 0
|
4月前
|
Serverless
【PTA刷题+代码+详解】求二叉树度为1的结点个数(递归法)
【PTA刷题+代码+详解】求二叉树度为1的结点个数(递归法)
118 0
|
5月前
|
算法
代码随想录算法训练营第十八天 | 力扣 513. 找树左下角的值、112. 路径总和、113. 路径总和 II、106. 从中序与后序遍历序列构造二叉树、105. 从前序与中序遍历序列构造二叉树
代码随想录算法训练营第十八天 | 力扣 513. 找树左下角的值、112. 路径总和、113. 路径总和 II、106. 从中序与后序遍历序列构造二叉树、105. 从前序与中序遍历序列构造二叉树
33 0
|
8月前
|
存储 算法 C语言
【树】你真的会二叉树了嘛? --二叉树LeetCode专题Ⅱ
这里有两种方法(深度优先搜索与广度优先搜索)其实也就是前序遍历与层序遍历,层序遍历这里简单提一下.与上面的大同小异就不过多赘述了:依旧是遍历出每一层最大的值,将其放入数组即可.
45 0
|
10月前
剑指offer 35. 二叉树中和为某一值的路径
剑指offer 35. 二叉树中和为某一值的路径
36 0
|
10月前
剑指offer_二叉树---之字形打印二叉树
剑指offer_二叉树---之字形打印二叉树
38 0
|
10月前
剑指offer_二叉树---二叉树的下一节点
剑指offer_二叉树---二叉树的下一节点
44 0
|
10月前
剑指offer_二叉树---从上往下打印二叉树
剑指offer_二叉树---从上往下打印二叉树
40 0