【剑指offer】-二叉树中和为某一值的路径-24/67

简介: 【剑指offer】-二叉树中和为某一值的路径-24/67

1. 题目描述

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

2. 题目分析

  1. 首先,我们要明白路径指的是什么

    如上所示,路径有4条,分别为:
    1——>2——>4 路径值:7
    1——>2——>5——>7 路径值:15
    1——>2——>5——>8 路径值:16
    1——>3——>6 路径值:10
    如果,当前的target等于上述路径的值,则输出该路径
  2. 我们创建需要返回的元素及一个链式的数组表
ArrayList<ArrayList<Integer>> listAll = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list = new ArrayList<Integer>();

如果当前树为空的话,则:

if (root == null) { return listAll; }

不为空的话,则将root结点添加到list中且刷新target的值:

list.add(root.val); target = target - root.val;

如果碰到target为0且左右节点都为null的位置,则将现在的list添加至listAll:

if (target == 0 && root.left == null && root.right == null) {
      listAll.add(new ArrayList<Integer>(list));
    }
这里要注意关于new一个新的list的问题:因为路径可能有多条,所以为了不影响后续操作,我们每一次遍历建立一个新的list

对其左子树进行遍历:FindPath(root.left, target);

对其右子树进行遍历:FindPath(root.right, target);

如果到达叶节点的时候,我们需要往上返回一层,才能接着遍历:list.remove(list.size()-1);

最后返回整个listAll

3. 题目代码

import offer.Test20.TreeNode;
public class Test24 {
  ArrayList<ArrayList<Integer>> listAll = new ArrayList<ArrayList<Integer>>();
  ArrayList<Integer> list = new ArrayList<Integer>();
  public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
    if (root == null) {
      return listAll;
    }
    list.add(root.val);
    target = target - root.val;
    if (target == 0 && root.left == null && root.right == null) {
      listAll.add(new ArrayList<Integer>(list));
    }
    FindPath(root.left, target);
    FindPath(root.right, target);
    list.remove(list.size()-1);
    return listAll;
  }
}


相关文章
|
2月前
|
人工智能 测试技术 Windows
【深度优先搜索】【树】【状态压缩】2791. 树中可以形成回文的路径数
【深度优先搜索】【树】【状态压缩】2791. 树中可以形成回文的路径数
|
6月前
代码随想录Day15 二叉树 LeetCodeT513 找树左下角的值 T112路径总和 T106 从中序和后序遍历构造二叉树
代码随想录Day15 二叉树 LeetCodeT513 找树左下角的值 T112路径总和 T106 从中序和后序遍历构造二叉树
25 0
|
5月前
|
算法
代码随想录算法训练营第十八天 | 力扣 513. 找树左下角的值、112. 路径总和、113. 路径总和 II、106. 从中序与后序遍历序列构造二叉树、105. 从前序与中序遍历序列构造二叉树
代码随想录算法训练营第十八天 | 力扣 513. 找树左下角的值、112. 路径总和、113. 路径总和 II、106. 从中序与后序遍历序列构造二叉树、105. 从前序与中序遍历序列构造二叉树
33 0
|
6月前
|
存储 C++
剑指offer(C++)-JZ34:二叉树中和为某一值的路径(二)(数据结构-树)
剑指offer(C++)-JZ34:二叉树中和为某一值的路径(二)(数据结构-树)
剑指offer(C++)-JZ34:二叉树中和为某一值的路径(二)(数据结构-树)
|
6月前
|
C++
剑指offer(C++)-JZ82:二叉树中和为某一值的路径(一)(数据结构-树)
剑指offer(C++)-JZ82:二叉树中和为某一值的路径(一)(数据结构-树)
|
6月前
|
存储 算法 C++
剑指offer(C++)-JZ84:二叉树中和为某一值的路径(三)(数据结构-树)
剑指offer(C++)-JZ84:二叉树中和为某一值的路径(三)(数据结构-树)
|
10月前
剑指offer 35. 二叉树中和为某一值的路径
剑指offer 35. 二叉树中和为某一值的路径
36 0
|
10月前
剑指offer_二叉树---二叉树中和为某一值的路径
剑指offer_二叉树---二叉树中和为某一值的路径
57 0
|
10月前
|
存储 算法 Java
代码随想录训练营day18| 513.找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树...
代码随想录训练营day18| 513.找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树...