【问题描述】[中等]

输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。示例:
给定如下二叉树,以及目标和 sum = 22,5/ \4   8/   / \11  13  4/  \    / \7    2  5   1
返回:[[5,4,11,2],[5,8,4,5]
]提示:节点总数 <= 10000

【解答思路】

1. 回溯


时间复杂度:O(N) 空间复杂度:O(N)

class Solution {LinkedList<List<Integer>> res = new LinkedList<>();LinkedList<Integer> path = new LinkedList<>(); public List<List<Integer>> pathSum(TreeNode root, int sum) {recur(root, sum);return res;}void recur(TreeNode root, int tar) {if(root == null) return;path.add(root.val);tar -= root.val;if(tar == 0 && root.left == null && root.right == null)res.add(new LinkedList(path));recur(root.left, tar);recur(root.right, tar);path.removeLast();}
}

sum==target 作为出口

LinkedList<List<Integer>> res = new LinkedList<>();LinkedList<Integer> path = new LinkedList<>(); public List<List<Integer>> pathSum(TreeNode root, int sum) {recur(root, sum, 0);return res;}void recur(TreeNode root, int sum,int tar) {if(root == null) return;path.add(root.val);tar += root.val;if(tar == sum && root.left == null && root.right == null)res.add(new LinkedList(path));recur(root.left,sum, tar);recur(root.right,sum, tar);path.removeLast();//回溯}

详细注释

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public List<List<Integer>> pathSum(TreeNode root, int sum) {List<List<Integer>> lists = new ArrayList<>();if(root == null) return lists;findPath(new ArrayList<Integer>(),root,sum,0,lists);return lists;}/** path:用于存放当前节点所在的路径(随着遍历一直在变动)*/private static void findPath(List<Integer> path, TreeNode node, int sum, int tempSum,List<List<Integer>> lists) {//到当前节点位置的路径的节点值的和tempSum += node.val;//path.add(node.val);if(tempSum == sum && node.left == null &&node.right == null) {//得到一个符合要求的路径时,创建一个新的ArrayList,拷贝当前路径到其中,并添加到lists中lists.add(new ArrayList(path));}if(node.left != null) {findPath(path,node.left,sum,tempSum,lists);//递归结束时,该留的路径已经记录了,不符合的路径也都不用理,删掉当前路径节点的值path.remove(path.size()-1);}if(node.right != null) {findPath(path,node.right,sum,tempSum,lists);//递归结束时,该留的路径已经记录了,不符合的路径也都不用理,删掉当前路径节点的值path.remove(path.size()-1);}}
}

【总结】

1.浅拷贝 深拷贝


2. res.add(new LinkedList(path))对比res.add(path)

res.add(path) 浅拷贝
res.add(new LinkedList(path)) 深拷贝
记录路径时若直接执行 res.append(path) ,则是将 path 列表对象 加入了 res ;后续 path 对象改变时, res 中的 path 对象 也会随之改变(因此肯定是不对的,本来存的是正确的路径 path ,后面又 append 又 pop 的,就破坏了这个正确路径)。list(path) 相当于新建并复制了一个 path 列表,因此不会受到 path 变化的影响。

3.回溯记得要回溯~ 体现回溯
path.removeLast();//回溯

转载链接:https://leetcode-cn.com/problems/er-cha-shu-zhong-he-wei-mou-yi-zhi-de-lu-jing-lcof/solution/mian-shi-ti-34-er-cha-shu-zhong-he-wei-mou-yi-zh-5/
参考链接:https://leetcode-cn.com/problems/er-cha-shu-zhong-he-wei-mou-yi-zhi-de-lu-jing-lcof/solution/yi-kan-jiu-dong-xi-lie-by-mu-yi-wei-lan/

[剑指offer][JAVA]面试题第[34]题[二叉树中和为某一值的路径][回溯]相关推荐

  1. [剑指offer][JAVA]面试题第[27]题[二叉树的镜像][递归][栈]

    [问题描述][中等] 请完成一个函数,输入一个二叉树,该函数输出它的镜像.例如输入:4/ \2 7/ \ / \ 1 3 6 9 镜像输出:4/ \7 2/ \ / \ 9 6 3 1示例 1:输入: ...

  2. [剑指offer][JAVA]面试题第[31]题[栈的压入、弹出序列][栈]

    [问题描述][中等] 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4 ...

  3. [剑指offer][JAVA]面试题第[39]题[数组中出现次数超过一半的数字][HashMap][摩尔投票法]

    [问题描述][简单] 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.你可以假设数组是非空的,并且给定的数组总是存在多数元素.示例 1:输入: [1, 2, 3, 2, 2, 2, 5, ...

  4. [剑指offer][JAVA]面试题第[32-3]题[从上到下打印二叉树 ][BFS]

    [问题描述][中等] 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 例如: 给定二叉树: [3 ...

  5. [剑指offer][JAVA]面试题第[32-2]题[从上到下打印二叉树][BFS]

    [问题描述][简单] 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行.例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 ...

  6. [剑指offer][JAVA]面试题第[32-1]题[从上到下打印二叉树][BFS]

    [问题描述][中等] 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回: ...

  7. [剑指offer][JAVA]面试题第[30]题[包含min函数的栈][双栈辅助栈][单栈]

    [问题描述][中等] 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1).示例:MinStack min ...

  8. [剑指offer][JAVA]面试题第[16]题[数值的整数次方][位运算][二分法]

    [问题描述][中等] 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题.示例 1:输入: ...

  9. [剑指offer][JAVA]面试题第[12]题[矩阵的路径][DFS][剪枝]

    [问题描述][中等] 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格.如果一条路径经过了矩阵的某 ...

最新文章

  1. opencv C++ 三重for循环遍历RGB图像像素(逐像素操作、操作像素值、遍历像素遍历)at<typename>(i,j)、灰度图at<uchar>、at<Vec3b>、at<Vec3F>
  2. angular 字符串转换成数字_Python | 一文看懂Python列表、元组和字符串操作
  3. 2018最火机器学习项目盘点—CV项目领冠榜单
  4. 2021年中国醋栗果提取物市场趋势报告、技术动态创新及2027年市场预测
  5. 如何避免delete和delete[]的尴尬?
  6. 二次元日系游戏制作工具 - live2dSDK入门教程
  7. CoVaR计算手册-动态CoVaR模型-数据、代码、步骤
  8. snb处理器hd3000显卡专用extra_Intel十代酷睿处理器:移动平台性能有了质飞跃!...
  9. 我的毕业旅行--Four night in beijing
  10. flv文件转换成mp4格式的方法
  11. android 那个桌面好,Hola桌面 可能是最好用的安卓手机桌面
  12. 职场“巨婴”,毁人不倦
  13. OpenCV+ip摄像头实现远程实时监控
  14. CentOS7_mysql数据库备份
  15. VC++钩子使用之全局键盘钩子
  16. 一文读懂什么是阿里云OSS,如何使用Java操作阿里云OSS?
  17. PDF查看控件Spire.PDFViewer for .NET
  18. 判断是pc端还是手机端
  19. 常见文件错误,NotADirectoryError: [WinError 267] 目录名称无效。PermissionError: [WinError 5] 拒绝访问。
  20. 自动隐身、无察觉截屏、带有密码保护的监视神器

热门文章

  1. 阿里云CentOS服务器挂载数据盘
  2. javascript判断图片是否加载完成方法整理
  3. inline,block,inline-block的区别
  4. POJ 1300 Door Man(欧拉回路的判定)
  5. 7zip File: How to Uncompress 7z files on Ubuntu, Debian, Fedora
  6. http modules在.net安全认证中的作用
  7. 2018java基础面试题(我自己用的,面试好多家公司基本会问到的问题和技术)
  8. Minimum supported Gradle version is 4.1. Current version is 4.0.
  9. stm32f401 边沿捕获_STM32_capture 基于 设计的输入捕获实验,通过对边沿跳变的采集,得到外部接口 据。 SCM 单片机开发 261万源代码下载- www.pudn.com...
  10. 通过mvn dependency:tree 查看依赖树,解决依赖jar冲突问题