剑指 Offer 34. 二叉树中和为某一值的路径

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

示例:

给定如下二叉树,以及目标和 target = 22,

          5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1

返回:

[
[5,4,11,2],
[5,8,4,5]
]

提示:

  • 节点总数 <= 10000

做题思路:

首先明白这道题要求的是对树进行一次遍历,然后在遍历的时候记录从根节点到当前节点的路径和,以防止重复计算。所以可以采用深度搜索的方式,初始化LinkedList<List> res,然后递归查找不同节点,如果路径和等于target或者root.left为空或者root.right为空,则将查找的路径和的各个节点加入res即可,然后最后返回res。

class Solution {
LinkedList<List<Integer>> res = new LinkedList<>();
public List<List<Integer>> pathSum(TreeNode root, int target) {
recur(root, target, new LinkedList<>());
return res;
} void recur(TreeNode root, int target, LinkedList<Integer> path) {
if (root == null) return;
path.add(root.val);
if (getSum(path) == target && root.left == null && root.right == null)
res.add(new LinkedList(path));
recur(root.left, target, path);//递归左节点
recur(root.right, target, path);//递归右节点
path.removeLast(); //向上回溯前,需要将当前节点从路径 path 中删除,即执行 path.removeLast() 。
} int getSum(LinkedList<Integer> list) {//求得路径和
int sum = 0;
for (int i : list) sum += i;
return sum;
}
}

这是k神更为简洁的代码可以借鉴一下,因为若单独写一个 getSum() 函数,则会产生不必要的额外计算。

算法流程:

pathSum(root, sum)函数:

  • 初始化: 结果列表 res ,路径列表 path 。

  • 返回值: 返回 res 即可。

    recur(root, tar)recur(root, tar) 函数:

  • 递推参数: 当前节点 root ,当前目标值 tar 。

  • 终止条件: 若节点 root 为空,则直接返回。

  • 递推工作:

    • 路径更新: 将当前节点值 root.val 加入路径 path ;
    • 目标值更新: tar = tar - root.val(即目标值 tar 从 sum 减至 00 );
    • 路径记录: 当 ① root 为叶节点 且 ② 路径和等于目标值 ,则将此路径 path 加入 res 。
    • 先序遍历: 递归左 / 右子节点。
    • 路径恢复: 向上回溯前,需要将当前节点从路径 path 中删除,即执行 path.pop() 。
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();
}
}

这个是官方题解,与k神的代码不同,一个是LinkedList,一个Deque。

class Solution {
List<List<Integer>> ret = new LinkedList<List<Integer>>();
Deque<Integer> path = new LinkedList<Integer>(); public List<List<Integer>> pathSum(TreeNode root, int target) {
dfs(root, target);
return ret;
} public void dfs(TreeNode root, int target) {
if (root == null) {
return;
}
path.offerLast(root.val);
target -= root.val;
if (root.left == null && root.right == null && target == 0) {
ret.add(new LinkedList<Integer>(path));
}
dfs(root.left, target);
dfs(root.right, target);
path.pollLast();
}
}

参考链接:

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/

剑指 Offer 34. 二叉树中和为某一值的路径的更多相关文章

  1. 剑指 Offer 34. 二叉树中和为某一值的路径 + 记录所有路径

    剑指 Offer 34. 二叉树中和为某一值的路径 Offer_34 题目详情 题解分析 本题是二叉树相关的题目,但是又和路径记录相关. 在记录路径时,可以使用一个栈来存储一条符合的路径,在回溯时将进 ...

  2. 【Java】 剑指offer(34) 二叉树中和为某一值的路径

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有 ...

  3. 每日一题 - 剑指 Offer 34. 二叉树中和为某一值的路径

    题目信息 时间: 2019-06-27 题目链接:Leetcode tag:深度优先搜索 回溯法 难易程度:中等 题目描述: 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从 ...

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

    剑指Offer:二叉树中和为某一值的路径[34] 题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. ...

  5. 【剑指Offer】二叉树中和为某一值的路径 解题报告(Python)

    [剑指Offer]二叉树中和为某一值的路径 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervi ...

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

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

  7. Go语言实现:【剑指offer】二叉树中和为某一值的路径

    该题目来源于牛客网<剑指offer>专题. 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路 ...

  8. 《剑指offer》二叉树中和为某一值的路径

    本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:

  9. 【剑指offer】二叉树中和为某一值的路径,C++实现

    原创文章,转载请注明出处! 博客文章索引地址 1.题目 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径由结点和有向边组成,从根结点到叶节点. // 二叉树结点的定义 st ...

随机推荐

  1. Selenium环境搭建 - Mac电脑

    一. JDK安装 1.1.官网下载1.8版本 可参考以下链接步骤: 'https://blog.csdn.net/u014801367/article/details/86288078' 1.2.jd ...

  2. 升级vs更新,用词莫忘准确(附PHP版本升级教程)

    升级vs更新 Web技术日新月异,更新升级是维护工作之一,长时间不更新(升级)的程序,就如长时间不维护的建筑物一样,会加速老化.功能逐渐缺失直至无法使用.而我们最近发现,有的朋友对"更新&q ...

  3. [JS]回调函数和回调地狱

    回调函数 小明在奶茶店点了奶茶,店员开始制作奶茶,此时"制作奶茶"与"小明等待奶茶"是一个同时进行的不同的两个事件(任务),那么,小明获取店员制作成功的奶茶是从 ...

  4. C 购买商品的游戏

    1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 /* 5 *模拟实现道具店购物 ...

  5. java使用Selenium操作谷歌浏览器学习笔记(三)键盘操作

    我们用Selenium打开网页后,可能需要在输入框输入一些内容等等,这时候就需要键盘操作了 使用sendKEys进行键盘操作,在bing的搜索框中输入内容并点击跳转 1 import org.open ...

  6. Semi-automation Script Based on Sleep

    The following script auto login to server 49, send 2 commands and exit from the server. Create a aut ...

  7. DLL劫持漏洞

    写文章的契机还是看沙雕群友挖了十多个DLL劫持的漏洞交CNVD上去了... 就想起来搜集整理一下这部分 0x01 前言 DLL(Dynamic Link Library)文件为动态链接库文件,又称&q ...

  8. Sqli-Labs less26-28a

    less-26 从第26关开始,我的sqli-labs就在docker上运行了,因为windows中阿帕奇对空格的转义有问题 通过源码可以看到有很多过滤,包括空格 or和and. 方法: or可以用| ...

  9. NOIP 模拟 $36\; \rm Cicada 与排序$

    题解 \(by\;zj\varphi\) 设 \(rk_{i,j}\) 表示第 \(i\) 个数最后在相同的数里排第 \(j\) 位的概率. 转移时用一个 \(dp\),\(dp_{i,j,0/1}\ ...

  10. NOIP 模拟 $19\; \rm u$

    题解 \(by\;zj\varphi\) 二维差分的题目 维护两个标记,一个向下传,一个向右下传: 对于每次更新,我们可以直接更新 \((r,c)+s,(r+l,c)-s\) ; \((r,c+1)- ...