246.二叉树的路径和 II

描述

给一棵二叉树和一个目标值,设计一个算法找到二叉树上的和为该目标值的所有路径。 路径可以从任何结点出发和结束,但是需要是一条一直往下走的路线。也就是说, 路径上的结点的层级是逐个递增的。

样例

对于二叉树:

            1
           / \
          2   3
         /   /
        4   2

给定目标值6。那么满足条件的路径有两条:

        [
          [2, 4],
          [1, 3, 2]
        ]

思路:

从根结点开始往下遍历二叉树,每遍历一个结点,就把当前结点当做终点,向着根结点往回遍历,返回满足条件的结点, 不可能从 root 开始使用 target-root.val 因为根本不知道路径的起点从哪开始

代码

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */
public class Solution {
    /**
     * @param root the root of binary tree
     * @param target an integer
     * @return all valid paths
     */
    public List<List<Integer>> binaryTreePathSum2(TreeNode root, int target) {
        List<List<Integer>> results = new ArrayList<List<Integer>>();
        ArrayList<Integer> buffer = new ArrayList<Integer>();
        
        if (root == null) {
            return results;
        }
        
        findSum(root, target, 0, buffer, results);
        return results;
    }

    public void findSum(TreeNode head,
                        int sum,
                        int level,
                        ArrayList<Integer> buffer,
                        List<List<Integer>> results) {
        if (head == null) {
            return;
        }
        
        // target
        int tmp = sum;
        // buffer 数组缓存从上到下的结点值,下标为 level,方便 for 循环中根据 level 获取元素
        buffer.add(head.val);
        // 以当前结点为终点往回寻找,如果找回到根结点仍不满足,终点沿着树向下移动
        for (int i = level; i >= 0; i--) {
            tmp -= buffer.get(i);
            // 将满足的和为sum的连续结点(一条完整路径)加入temp数组
            // 将路径加入results
            if (tmp == 0) {
                List<Integer> temp = new ArrayList<Integer>();
                // 从下往上遍历到 i 层发现和满足目标
                // 从 i 往下遍历到 level 将路线上结点全部加入到 temp
                for (int j = i; j <= level; j++) {
                    temp.add(buffer.get(j));
                }
                results.add(temp);
            }
        }
        
        // 每向下遍历一个结点 level + 1
        findSum(head.left, sum, level + 1, buffer, results);
        findSum(head.right, sum, level + 1, buffer, results);
        // 回溯,当前结点是叶子结点没办法继续往下走了,沿着树往上走
        // 路径中去掉当前结点
        buffer.remove(buffer.size() - 1);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 数据结构和算法--二叉树的实现 几种二叉树 1、二叉树 和普通的树相比,二叉树有如下特点: 每个结点最多只有两棵子...
    sunhaiyu阅读 11,588评论 0 14
  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 14,592评论 0 25
  • 树和二叉树 1、树的定义 树(Tree)是由一个 或 多个结点 组成的有限集合T,且满足: ①有且仅有一个称为根的...
    利伊奥克儿阅读 5,292评论 0 1
  • 四、树与二叉树 1. 二叉树的顺序存储结构 二叉树的顺序存储就是用数组存储二叉树。二叉树的每个结点在顺序存储中都有...
    MinoyJet阅读 5,538评论 0 7
  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 9,952评论 1 31

友情链接更多精彩内容