二叉树中是否存在节点和为指定值的路径

1、从根节点到叶子节点

1.1、参考资料

https://www.nowcoder.com/practice/508378c0823c423baa723ce448cbfd0c

1.2、题目要求

给定一个二叉树和一个值 target,判断是否有从根节点到叶子节点的节点值之和等于 target 的路径,例如:给出如下的二叉树,target=22,程序运行返回 true,因为存在一条路径 5 ---> 4 ---> 11 ---> 2,其节点路径值为 22

1.3、代码思路

题目的思路

  1. 看到二叉树的路径问题,多半都是用 dfs,首先我们需要明确题目的意思:从根节点出发,到叶子节点停止
  2. 递归难就难在:我们在还未编写完成 dfs() 函数时,就需要明确这个函数到底需要完成什么功能?参数有哪些?返回值代表什么含义?这些只有在写递归函数的时候,一步一步摸索出来
  3. 我们现在假定 boolean dfs(TreeNode curNode, int target) 函数的作用为:接收一个节点 curNode,接受一个路径的目标值 target,返回从该节点到叶子节点是否存在目标路径,使得路径的值等于 target

好了,现在明确了函数的作用之后,现在可以编写函数的逻辑了

  1. 首先,深度优点遍历来说,想都不用想,上来直接先写上一个回溯 if (curNode == null) { return false; },这表示递归至最深层开始回溯,至于为什么 return false 后面再讲

  2. 每次进入函数时,将 target 减去当前节点的权重(curNode.val),当 target 减到零时,说明目标路径存在,另外我们的目标是到叶子节点停止,叶子节点的条件是 curNode.left == null && curNode.right == null,所以说当 if (curNode.left == null && curNode.right == null && target == 0) {,我们返回 true 表示找到目标路径

  3. 深度遍历的分支:对于当前节点 curNode 有两个分支,这两个分支都有可能成为目标路径,所以深度优先遍历的写法为 return dfs(curNode.left, target) || dfs(curNode.right, target);

  4. 现在来谈谈为什么回溯时需要返回 false,因为当 curNode 为叶子节点时,并且 target == 0 时,我们已经返回了 true,剩下的情况就是 curNode 不是叶子节点或者路径值不为 target,所应该返回 false'

1.4、代码实现

代码

public class Solution {public boolean hasPathSum(TreeNode root, int target) {// Guard Safeif (root == null) {return false;}// 深度优先遍历return dfs(root, target);}private boolean dfs(TreeNode curNode, int target) {// 目标路径不存在,开始回溯if (curNode == null) {return false;}// 更新目标值target -= curNode.val;// 当当前节点为叶子节点并且目标路径存在时,返回 trueif (curNode.left == null && curNode.right == null && target == 0) {return true;}// 对左右分支进行 dfsreturn dfs(curNode.left, target) || dfs(curNode.right, target);}
}public class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;
}

2、从任意节点到叶子节点

2.1、题目要求

判断是否有从任意节点到叶子节点的节点值之和等于 target 的路径,

2.2、代码思路

  1. 因为要判断当前节点到叶子节点的是否存在目标路径,所以 boolean dfs(TreeNode curNode, int target) { 函数还是和上面的一样
  2. 由于需要以树中的每个节点(root)作为根节点,判断以 root 作为根节点的子树是否存在目标路径,这也需要进行递归,boolean hasPathSum(TreeNode root, int target) { 函数便实现了此功能
  3. boolean hasPathSum(TreeNode root, int target) { 函数先判断 root 节点到叶子节点是否存在目标路径;然后进行左递归:判断以 root.left 为根节点的子树是否存在目标路径;然后进行右递归:判断以 root.right 为根节点的子树是否存在目标路径

2.3、代码实现

代码

public class Solution {public boolean hasPathSum(TreeNode root, int target) {// Guard Safeif (root == null) {return false;}// 1.判断 root 节点到叶子节点是否存在目标路径// 2.以 root.left 为根节点的子树是否存在目标路径// 3.以 root.right 为根节点的子树是否存在目标路径return dfs(root, target) || hasPathSum(root.left, target) || hasPathSum(root.right, target);}private boolean dfs(TreeNode curNode, int target) {// 目标路径不存在,开始回溯if (curNode == null) {return false;}// 更新目标值target -= curNode.val;// 当当前节点为叶子节点并且目标路径存在时,返回 trueif (curNode.left == null && curNode.right == null && target == 0) {return true;}// 对左右分支进行 dfsreturn dfs(curNode.left, target) || dfs(curNode.right, target);}
}public class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;
}

3、从任意节点到任意节点

3.1、题目要求

判断是否有从任意节点到任意节点的节点值之和等于 target 的路径,

3.2、代码思路

额,boolean dfs(TreeNode curNode, int target) { 函数的实现逻辑需要改变,我们不需要走到叶子节点,走到任意一个节点,只要路径存在,则返回 true

3.3、代码实现

代码

public class Solution {public boolean hasPathSum(TreeNode root, int target) {// Guard Safeif (root == null) {return false;}// 1.判断 root 节点到叶子节点是否存在目标路径// 2.以 root.left 为根节点的子树是否存在目标路径// 3.以 root.right 为根节点的子树是否存在目标路径return dfs(root, target) || hasPathSum(root.left, target) || hasPathSum(root.right, target);}private boolean dfs(TreeNode curNode, int target) {// 目标路径不存在,开始回溯if (curNode == null) {return false;}// 更新目标值target -= curNode.val;// 当当前节点为叶子节点并且目标路径存在时,返回 trueif (target == 0) {return true;}// 对左右分支进行 dfsreturn dfs(curNode.left, target) || dfs(curNode.right, target);}}public class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;
}

二叉树中是否存在节点和为指定值的路径相关推荐

  1. 牛客题霸 [二叉树中是否存在节点和为指定值的路径] C++题解/答案

    牛客题霸 [二叉树中是否存在节点和为指定值的路径] C++题解/答案 题目描述 给定一个二叉树和一个值\ sum sum,判断是否有从根节点到叶子节点的节点值之和等于\ sum sum 的路径, 例如 ...

  2. 牛客题霸 NC9 二叉树中是否存在节点和为指定值的路径

    https://www.nowcoder.com/practice/508378c0823c423baa723ce448cbfd0c 解决方案 Go func hasPathSum(root *Tre ...

  3. leetcode 112 --- 二叉树根节点到叶子节点和为指定值的路径

    1 题目 给定一个二叉树和一个值sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径. 2 解法 用递归的方法,如果当前不是叶子节点,就把sum减去当前的值,并把当前节点当作路径节点pu ...

  4. 牛客题霸 NC8 二叉树根节点到叶子节点和为指定值的路径

    https://www.nowcoder.com/practice/840dd2dc4fbd4b2199cd48f2dadf930a 解决方案 Go var ans [][]int = make([] ...

  5. 剑指offer之求二叉树中两个节点的最低共同父节点

    1 问题 求二叉树中俩个节点的最低共同父节点,比如二叉树如下 42 61 3 5 7 比如节点1和3两个节点的最低共同父节点是2,节点3和5两个节点的最低共同父节点是4,节点5和6两个节点的最低共同父 ...

  6. 求一颗二叉树中两个节点的最低公共父节点

    题目:求一棵二叉树中两个节点的最低公共父节点 思路:递归 和 非递归 public static TreeNode getLastCommonParentRec(TreeNode root, Tree ...

  7. 左神算法基础班4_4_3在二叉树中找到一个节点的后继节点

    Problem: 在二叉树中找到一个节点的后继节点 [题目] 现在有一种新的二叉树节点类型如下: public class Node { public int value; public Node l ...

  8. 程序员面试100题之十六:二叉树中两个节点的最近公共父节点(最低的二叉树共同祖先)

    这个问题可以分为三种情况来考虑: 情况一:root未知,但是每个节点都有parent指针 此时可以分别从两个节点开始,沿着parent指针走向根节点,得到两个链表,然后求两个链表的第一个公共节点,这个 ...

  9. 求二叉树中两个节点最远的距离

    一说到二叉树,就有很多题目,今天在编程之美中看到了二叉树中两个节点最远的距离.所以给想借机写一篇博客. 在开始之前,我们先想想,两个最常节点的最远距离是怎么样的? 情况一:最大距离可能一个在左子树,一 ...

最新文章

  1. Java:在Bean中使用PropertyChangeSupport支持PropertyChangeListeners
  2. 【JAVA资料免费下载】158个JAVA免豆精品资料汇总——下载目录(转载)
  3. 搜索运营有哪些玩法,你知道吗?
  4. Golang并发编程进程通信channel了解及简单使用
  5. 数组中相同元素 java_如何在一维数组中查找某重复元素,并输出其位置?用java实现...
  6. 80后小学计算机课上的游戏,80后最值得回味的经典课间游戏
  7. Linux运维养成记-磁盘管理LVM 逻辑卷
  8. 计算机启动后无法进入系统怎么办,笔记本开机进不了系统,小编教你笔记本开机无法进入系统怎么办...
  9. Excel文件处理-Python之openpyxl
  10. Unbalanced calls to begin/end appearance transitions for
  11. tplink 2.4g弱信号剔除_路由器信号分为2.4G和5G,这两种信号有什么区别
  12. (dfppy)2Ir(NHC)的蓝光/蓝绿光铱配合物|苯基喹啉酯的中性铱配合物-齐岳生物
  13. 彬彬说,真正的喜欢一个人就会用心的去揣摩她,去知道她喜欢什么,什么性格...
  14. 关于java的1234
  15. 考研英语 长难句训练day65
  16. 【1047】删除字符串中的所有相邻重复项
  17. 我啊,程序员啊程序员
  18. leetcode122-买卖股票的最佳时机 II
  19. 清华大学计算机科学王昊,日照最好的三所高中,新鲜出炉!
  20. laydate动态设定时间范围

热门文章

  1. 2021-2025年中国冻融室行业市场供需与战略研究报告
  2. php 向py发起请求,Python向PHP发起GET与POST请求
  3. 秋招开始,求职别慌!C 认证了解一下!
  4. 新功能又来啦!这次是「代码搜索」和视频直播!
  5. 有了 Git 这个操作,我再也不怕代码混乱了!
  6. 告别求职难!一汽-大众专场直播招聘来了
  7. 身为开发人员,这些数据库合知识不掌握不合适!
  8. 国内首个 Serverless 数据库来了,技术架构全揭秘!
  9. 初探在容器上构建持续部署!
  10. 华为面向全球发布HMS Core 4.0意味着什么?