剑指offer 二叉树之中为某一直的路径是否存在

本文介绍了如何使用DFS和递归策略解决二叉树中查找路径问题,通过示例展示了如何在`TreeNode`结构中找到从根节点到叶子节点,路径上节点值之和等于给定目标值的路径。作者提供了两种方法的代码实现,并强调了DFS中回溯过程的特殊处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

在这里插入图片描述

思路

思路一:
使用DFS来做
想到这个是应为每次得到一条路径的时候,如果他不是目标路径,我们回退的时候,是需要把路径上面节点的值减去的,这个让我想到了DFS在每次调用的时候函数里面都可以一开始加上这个值最后减去这个值

思路二:
递归的方法
分解为找寻子树是是sum-root。val的值的路径
结束条件是一个没有孩子的节点的值是sum的值或者该节点是一个空节点。

代码


import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */
import java.util.*;
public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @param sum int整型 
     * @return bool布尔型
     */
    int val=0;
    int pathVal=0;
    public boolean DFS(TreeNode root){
        if(root==null)return false;
        pathVal+=root.val;
        boolean r=false,l=false;
        if(root.right!=null){
            r=DFS(root.right);
        }
        if(root.left!=null){
            l=DFS(root.left);
        }
        if(root.left==null&&root.right==null&&val==pathVal){
            return true;
        }
        pathVal-=root.val;
        return r||l;
        
    }
    public boolean hasPathSum (TreeNode root, int sum) {
        val=sum;
        if(root==null)return false;
      
        return  DFS(root);
        
    }
}
```

方法二:
```java

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @param sum int整型 
     * @return bool布尔型
     */
    public boolean hasPathSum (TreeNode root, int sum) {
        if(root==null)return false;
        return hasPathSum_p(root,sum);
    }
    public boolean hasPathSum_p (TreeNode root, int sum) {
        // write code here
        
       
        if(root==null)return false;
        if(root.left==null&&root.right==null&&root.val==sum)return true;
        return hasPathSum_p(root.left,sum-root.val)||hasPathSum_p(root.right,sum-root.val);
    }
}
```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值