二叉树中是否存在节点和为指定值的路径
二叉树中是否存在节点和为指定值的路径
1、从根节点到叶子节点
1.1、参考资料
https://www.nowcoder.com/practice/508378c0823c423baa723ce448cbfd0c
1.2、题目要求
给定一个二叉树和一个值 target
,判断是否有从根节点到叶子节点的节点值之和等于 target
的路径,例如:给出如下的二叉树,target=22
,程序运行返回 true
,因为存在一条路径 5 ---> 4 ---> 11 ---> 2
,其节点路径值为 22
1.3、代码思路
题目的思路
- 看到二叉树的路径问题,多半都是用
dfs
,首先我们需要明确题目的意思:从根节点出发,到叶子节点停止 - 递归难就难在:我们在还未编写完成
dfs()
函数时,就需要明确这个函数到底需要完成什么功能?参数有哪些?返回值代表什么含义?这些只有在写递归函数的时候,一步一步摸索出来 - 我们现在假定
boolean dfs(TreeNode curNode, int target)
函数的作用为:接收一个节点curNode
,接受一个路径的目标值target
,返回从该节点到叶子节点是否存在目标路径,使得路径的值等于target
好了,现在明确了函数的作用之后,现在可以编写函数的逻辑了
首先,深度优点遍历来说,想都不用想,上来直接先写上一个回溯
if (curNode == null) { return false; }
,这表示递归至最深层开始回溯,至于为什么return false
后面再讲每次进入函数时,将
target
减去当前节点的权重(curNode.val
),当target
减到零时,说明目标路径存在,另外我们的目标是到叶子节点停止,叶子节点的条件是curNode.left == null && curNode.right == null
,所以说当if (curNode.left == null && curNode.right == null && target == 0) {
,我们返回true
表示找到目标路径深度遍历的分支:对于当前节点
curNode
有两个分支,这两个分支都有可能成为目标路径,所以深度优先遍历的写法为return dfs(curNode.left, target) || dfs(curNode.right, target);
现在来谈谈为什么回溯时需要返回
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、代码思路
- 因为要判断当前节点到叶子节点的是否存在目标路径,所以
boolean dfs(TreeNode curNode, int target) {
函数还是和上面的一样 - 由于需要以树中的每个节点(
root
)作为根节点,判断以root
作为根节点的子树是否存在目标路径,这也需要进行递归,boolean hasPathSum(TreeNode root, int target) {
函数便实现了此功能 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;
}
二叉树中是否存在节点和为指定值的路径相关推荐
- 牛客题霸 [二叉树中是否存在节点和为指定值的路径] C++题解/答案
牛客题霸 [二叉树中是否存在节点和为指定值的路径] C++题解/答案 题目描述 给定一个二叉树和一个值\ sum sum,判断是否有从根节点到叶子节点的节点值之和等于\ sum sum 的路径, 例如 ...
- 牛客题霸 NC9 二叉树中是否存在节点和为指定值的路径
https://www.nowcoder.com/practice/508378c0823c423baa723ce448cbfd0c 解决方案 Go func hasPathSum(root *Tre ...
- leetcode 112 --- 二叉树根节点到叶子节点和为指定值的路径
1 题目 给定一个二叉树和一个值sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径. 2 解法 用递归的方法,如果当前不是叶子节点,就把sum减去当前的值,并把当前节点当作路径节点pu ...
- 牛客题霸 NC8 二叉树根节点到叶子节点和为指定值的路径
https://www.nowcoder.com/practice/840dd2dc4fbd4b2199cd48f2dadf930a 解决方案 Go var ans [][]int = make([] ...
- 剑指offer之求二叉树中两个节点的最低共同父节点
1 问题 求二叉树中俩个节点的最低共同父节点,比如二叉树如下 42 61 3 5 7 比如节点1和3两个节点的最低共同父节点是2,节点3和5两个节点的最低共同父节点是4,节点5和6两个节点的最低共同父 ...
- 求一颗二叉树中两个节点的最低公共父节点
题目:求一棵二叉树中两个节点的最低公共父节点 思路:递归 和 非递归 public static TreeNode getLastCommonParentRec(TreeNode root, Tree ...
- 左神算法基础班4_4_3在二叉树中找到一个节点的后继节点
Problem: 在二叉树中找到一个节点的后继节点 [题目] 现在有一种新的二叉树节点类型如下: public class Node { public int value; public Node l ...
- 程序员面试100题之十六:二叉树中两个节点的最近公共父节点(最低的二叉树共同祖先)
这个问题可以分为三种情况来考虑: 情况一:root未知,但是每个节点都有parent指针 此时可以分别从两个节点开始,沿着parent指针走向根节点,得到两个链表,然后求两个链表的第一个公共节点,这个 ...
- 求二叉树中两个节点最远的距离
一说到二叉树,就有很多题目,今天在编程之美中看到了二叉树中两个节点最远的距离.所以给想借机写一篇博客. 在开始之前,我们先想想,两个最常节点的最远距离是怎么样的? 情况一:最大距离可能一个在左子树,一 ...
最新文章
- Java:在Bean中使用PropertyChangeSupport支持PropertyChangeListeners
- 【JAVA资料免费下载】158个JAVA免豆精品资料汇总——下载目录(转载)
- 搜索运营有哪些玩法,你知道吗?
- Golang并发编程进程通信channel了解及简单使用
- 数组中相同元素 java_如何在一维数组中查找某重复元素,并输出其位置?用java实现...
- 80后小学计算机课上的游戏,80后最值得回味的经典课间游戏
- Linux运维养成记-磁盘管理LVM 逻辑卷
- 计算机启动后无法进入系统怎么办,笔记本开机进不了系统,小编教你笔记本开机无法进入系统怎么办...
- Excel文件处理-Python之openpyxl
- Unbalanced calls to begin/end appearance transitions for
- tplink 2.4g弱信号剔除_路由器信号分为2.4G和5G,这两种信号有什么区别
- (dfppy)2Ir(NHC)的蓝光/蓝绿光铱配合物|苯基喹啉酯的中性铱配合物-齐岳生物
- 彬彬说,真正的喜欢一个人就会用心的去揣摩她,去知道她喜欢什么,什么性格...
- 关于java的1234
- 考研英语 长难句训练day65
- 【1047】删除字符串中的所有相邻重复项
- 我啊,程序员啊程序员
- leetcode122-买卖股票的最佳时机 II
- 清华大学计算机科学王昊,日照最好的三所高中,新鲜出炉!
- laydate动态设定时间范围