牛客NC162 二叉树中和为某一值的路径(三)【中等 dfs C++、Java、Go、PHP】

题目

在这里插入图片描述
在这里插入图片描述
题目链接:
https://www.nowcoder.com/practice/965fef32cae14a17a8e86c76ffe3131f

思路

既然要找所有路径上节点和等于目标值的路径个数,那我们肯定先找这样的路径起点啊,
但是我们不知道起点究竟在哪里,
而且任意节点都有可能是起点,那我们就前序遍历二叉树的所有节点,每个节点都可以作
为一次起点,即子树的根节点。
具体做法:
     step 1:每次将原树中遇到的节点作为子树的根节点送入dfs函数中查找有无路径,
     如果该节点为空则返回。
     step 2:然后递归遍历这棵树每个节点,每个节点都需要这样操作。
     step 3:在dfs函数中,也是往下递归,遇到一个节点就将sum减去节点值再往下。
     step 4:剩余的sum等于当前节点值则找到一种情况。

参考答案C++

/**
 * struct TreeNode {
 *  int val;
 *  struct TreeNode *left;
 *  struct TreeNode *right;
 *  TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param root TreeNode类
     * @param sum int整型
     * @return int整型
     */
    int FindPath(TreeNode* root, int sum) {
    
            /*
            既然要找所有路径上节点和等于目标值的路径个数,那我们肯定先找这样的路径起点啊,但是我们不知道起点究竟在哪里,
            而且任意节点都有可能是起点,那我们就前序遍历二叉树的所有节点,每个节点都可以作为一次起点,即子树的根节点。
            具体做法:
               step 1:每次将原树中遇到的节点作为子树的根节点送入dfs函数中查找有无路径,如果该节点为空则返回。
               step 2:然后递归遍历这棵树每个节点,每个节点都需要这样操作。
               step 3:在dfs函数中,也是往下递归,遇到一个节点就将sum减去节点值再往下。
               step 4:剩余的sum等于当前节点值则找到一种情况。
            */

            int cnt = 0;
            int* ptr = &cnt;
            f(root, sum, ptr);
            return cnt;
        }

        void f(TreeNode * root, int sum, int* cnt) {
            if (root == nullptr) {
                return;
            }

            //以root根节点的路径数
            dfs(root, sum, cnt);
            //以root子节点为根的路径
            f(root->left, sum, cnt);
            f(root->right, sum, cnt);
        }

        void dfs(TreeNode * root, int sum, int* cnt) {
            if (root == nullptr) return;
            //符合要求,ans++
            if (root->val == sum) {
               // cout << "ddd" << endl;
                (*cnt)++;  //必须这样写,不能这样写*cnt++
            }

            //继续查找子节点
            dfs(root->left, sum - root->val, cnt);
            dfs(root->right, sum - root->val, cnt);
        }
    };

参考答案Java

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param root TreeNode类
     * @param sum int整型
     * @return int整型
     */
    public int FindPath (TreeNode root, int sum) {

        /*
        既然要找所有路径上节点和等于目标值的路径个数,那我们肯定先找这样的路径起点啊,但是我们不知道起点究竟在哪里,
        而且任意节点都有可能是起点,那我们就前序遍历二叉树的所有节点,每个节点都可以作为一次起点,即子树的根节点。
        具体做法:
            step 1:每次将原树中遇到的节点作为子树的根节点送入dfs函数中查找有无路径,如果该节点为空则返回。
            step 2:然后递归遍历这棵树每个节点,每个节点都需要这样操作。
            step 3:在dfs函数中,也是往下递归,遇到一个节点就将sum减去节点值再往下。
            step 4:剩余的sum等于当前节点值则找到一种情况。
         */

        int[] ans = {0};
        f(root, sum, ans);
        return ans[0];
    }

    public void f(TreeNode root, int sum, int[] ans) {
        //查询以某节点为根的路径数
        if (root == null) return ;
        dfs(root, sum, ans);

        //以其子节点为新的根节点的路径数
        f(root.left, sum, ans);
        f(root.right, sum, ans);
    }


    public void dfs(TreeNode root, int sum, int[] ans) {
        if (root == null) return;
        //符合目标,ans[0]++
        if (sum == root.val) ans[0]++;
        //子节点继续查找
        dfs(root.left, sum - root.val, ans);
        dfs(root.right, sum - root.val, ans);
    }
}

参考答案Go

package main

import . "nc_tools"

/*
 * type TreeNode struct {
 *   Val int
 *   Left *TreeNode
 *   Right *TreeNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param root TreeNode类
 * @param sum int整型
 * @return int整型
 */
func FindPath(root *TreeNode, sum int) int {
	/*
	   既然要找所有路径上节点和等于目标值的路径个数,那我们肯定先找这样的路径起点啊,但是我们不知道起点究竟在哪里,
	   而且任意节点都有可能是起点,那我们就前序遍历二叉树的所有节点,每个节点都可以作为一次起点,即子树的根节点。
	   具体做法:
	       step 1:每次将原树中遇到的节点作为子树的根节点送入dfs函数中查找有无路径,如果该节点为空则返回。
	       step 2:然后递归遍历这棵树每个节点,每个节点都需要这样操作。
	       step 3:在dfs函数中,也是往下递归,遇到一个节点就将sum减去节点值再往下。
	       step 4:剩余的sum等于当前节点值则找到一种情况。
	*/

	ans := [1]int{0}
	f(root, sum, &ans)
	return ans[0]
}

func f(root *TreeNode, sum int, ans *[1]int) {
	if root == nil {
		return
	}
	//查询以root为根的路径数
	dfs(root, sum, ans)
	//查询以root子节点为根的路径数
	f(root.Left, sum, ans)
	f(root.Right, sum, ans)
}

func dfs(root *TreeNode, sum int, ans *[1]int) {
	if root == nil {
		return
	}
	//符合目标,ans[0]++
	if root.Val == sum {
		ans[0]++
	}

	//子节点继续查找
	dfs(root.Left, sum-root.Val, ans)
	dfs(root.Right, sum-root.Val, ans)
}

参考答案PHP

<?php

/*class TreeNode{
    var $val;
    var $left = NULL;
    var $right = NULL;
    function __construct($val){
        $this->val = $val;
    }
}*/

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param root TreeNode类 
 * @param sum int整型 
 * @return int整型
 */
function FindPath( $root ,  $sum )
{
       /*
           既然要找所有路径上节点和等于目标值的路径个数,那我们肯定先找这样的路径起点啊,但是我们不知道起点究竟在哪里,
           而且任意节点都有可能是起点,那我们就前序遍历二叉树的所有节点,每个节点都可以作为一次起点,即子树的根节点。
           具体做法:
               step 1:每次将原树中遇到的节点作为子树的根节点送入dfs函数中查找有无路径,如果该节点为空则返回。
               step 2:然后递归遍历这棵树每个节点,每个节点都需要这样操作。
               step 3:在dfs函数中,也是往下递归,遇到一个节点就将sum减去节点值再往下。
               step 4:剩余的sum等于当前节点值则找到一种情况。
        */
    $ans=[0];
    f($root,$sum,$ans);
    return $ans[0];
}

function f($root,$sum,&$ans){
    if($root ==null) return;

    //以root为根的节点dfs
    dfs($root,$sum,$ans);
    //以root的子节点为根dfs
    f($root->left,$sum,$ans);
    f($root->right,$sum,$ans);
}

function dfs($root,$sum,&$ans){
    if($root ==null) return;
    //符合要求,ans++
    if($root->val ==$sum){
        $ans[0]++;
    }

    //子节点继续查找
    dfs($root->left,$sum-$root->val,$ans);
    dfs($root->right,$sum-$root->val,$ans);
}

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
题目要求:给定一个二叉树和一个整数target,找出所有从根节点到叶子节点路径之和等于target的路径。 解题思路:可以使用深度优先搜索(DFS)的方法来解决该问题。首先定义一个辅助函数来进行递归搜索,该辅助函数的参数包括当前节点、当前路径、当前路径的和以及目标和。在搜索过程中,需要维护一个数组来保存当前节点到根节点的路径。搜索过程如下: 1. 如果当前节点为空,则返回。 2. 将当前节点的添加到当前路径中。 3. 将当前节点的累加到当前路径的和中。 4. 如果当前节点是叶子节点,且当前路径的和等于目标和,则将当前路径添加到结果中。 5. 递归地搜索当前节点的左子树和右子树,并传递更新后的当前路径和当前路径的和。 最后,在主函数中调用辅助函数,并返回结果即可。 以下是题目的完整代码实现: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def pathSum(root, target): def dfs(node, path, path_sum, target, res): if not node: return path.append(node.val) path_sum += node.val if not node.left and not node.right: # 当前节点是叶子节点 if path_sum == target: res.append(path[:]) # 注意需要复制一份path,否则会出现问题 dfs(node.left, path, path_sum, target, res) dfs(node.right, path, path_sum, target, res) path.pop() # 回溯到父节点,去掉当前节点 path_sum -= node.val res = [] dfs(root, [], 0, target, res) return res ``` 这样就能找出所有满足路径和等于目标和的路径了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵长辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值