牛客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);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/564700.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】《机器学习建模基础》笔记

文章目录 单元0 前言单元1 数学建模与机器学习学习目标&#xff08;一&#xff09;什么是模型&#xff08;二&#xff09;数学模型的分类&#xff08;三&#xff09;数学建模的一般步骤&#xff08;四&#xff09;机器学习的概念&#xff08;五&#xff09;机器学习的分类&…

CTF-reverse-simpleRE(base64变表逆向)

题目链接 NSSCTF | 在线CTF平台 题目详情 [HUBUCTF 2022 新生赛]simple_RE 解题报告 下载得到的文件使用ida64分析&#xff0c;如果报错就换ida32&#xff0c;得到分析结果&#xff0c;有main函数就先看main main函数分析 main函数的逻辑看下来十分简单&#xff0c;因此关键…

机器学习(三)之监督学习2

前言&#xff1a; 本专栏一直在更新机器学习的内容&#xff0c;欢迎点赞收藏哦&#xff01; 笔者水平有限&#xff0c;文中掺杂着自己的理解和感悟&#xff0c;如果有错误之处还请指出&#xff0c;可以在评论区一起探讨&#xff01; 1.支持向量机&#xff08;Support Vector Ma…

混淆原理与实践指南

引言 &#x1f680; 在当今的软件开发领域&#xff0c;保护代码的安全性和保密性变得越来越重要。混淆&#xff08;Obfuscation&#xff09;技术作为一种保护代码的手段&#xff0c;在应对逆向工程和代码盗用方面发挥着关键作用。本文将深入探讨混淆的原理&#xff0c;以及如何…

【Flutter】One or more plugins require a higher Android SDK version.

问题描述 项目里多个组件需要更高版本的Android SDK One or more plugins require a higher Android SDK version.解决方案&#xff1a; 报错提示requires Android SDK version 34 按提示修改android项目app里build.gradle的compileSdkVersion 为34 android {compileSdkVe…

16.哀家要长脑子了!

目录 1. 707. 设计链表 - 力扣&#xff08;LeetCode&#xff09; 2.203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 3.206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 4.237. 删除链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 5. 19. 删除链…

实测数据的功率谱估计

目录 1.脉搏数据1.1 数据1的结果1.2 数据2的结果 2.振动加速度数据 1.脉搏数据 1.1 数据1的结果 1.2 数据2的结果 2.振动加速度数据

宏基因组|使用CheckM2评估分箱质量

简介 CheckM2使用机器学习快速评估基因组bin质量 与CheckM1不同&#xff0c;CheckM2采用通用训练的机器学习模型&#xff0c;无论分类学谱系如何&#xff0c;均可用于预测基因组bin的完整性和污染情况。这使得它能够在训练集中纳入许多仅具有少数&#xff08;甚至只有一个&am…

WSL安装-问题解决

WslRegisterDistribution failed with error: 0x8004032d WslRegisterDistribution failed with error: 0x80080005 Error: 0x80080005 ??????? 解决&#xff1a; 1、 winr输入&#xff1a;optionalfeatures.exe 2、打开这两项

Navicat 干货 | 掌握 PostgreSQL 规则语法

PostgreSQL 规则提供了一种强大的机制&#xff0c;控制查询执行并在数据库内部实施数据操作。理解规则的语法和用法对于有效利用其功能至关重要。在上周的文章中&#xff0c;我们探讨了 PostgreSQL 规则的工作原理及其与触发器的区别。今天的文章将使用免费的 “dvdrental”示例…

​Game Maker 0.10:让创作、协作和游戏变得更简单

继去年 12 月成功发布 Game Maker 0.9 之后&#xff0c;我们又隆重推出 Game Maker 0.10。在 0.9 更新的主要增强功能基础上&#xff0c;该版本为创作者实现其愿景提供了更多改进和工具。 为此&#xff0c;The Sandbox 还正式启动了全球范围的创作者训练营&#xff0c;以帮助我…

初学python记录:力扣377. 组合总和 Ⅳ

题目&#xff1a; 给你一个由 不同 整数组成的数组 nums &#xff0c;和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 提示&#xff1a; 1 < nums.length < 2001 < nums[i] < 1000nu…

双周总结#008 - AIGC

本周参与了公司同事对 AIGC 的分享会&#xff0c;分享了 AIGC 在实际项目中的实践经验&#xff0c;以及如何进行 AIGC 的落地。内容分几项内容&#xff1a; 什么是 AIGCAIGC 能做什么AIGC 工具 以年终总结为例&#xff0c;分享了哪些过程应用了 AIGC&#xff0c;以及 AIGC 落地…

一款pdf工具

下载链接&#xff1a;点击跳转&#xff1b; 它是一个installer&#xff0c;下好它之后&#xff0c;把网断掉&#xff0c;然后双击它&#xff0c;他会默认安装在C盘&#xff0c;安装时&#xff0c;浏览器可能会有一个弹窗&#xff0c;直接关掉并进入任务管理器杀掉所有smallerp…

go语言实现心跳机制样例

1、服务端代码&#xff1a; package mainimport ("fmt""net" )func handleClient(conn net.Conn) {defer conn.Close()fmt.Println("Client connected:", conn.RemoteAddr())// 读取客户端的数据buffer : make([]byte, 1024)for {n, err : conn…

如果备份了oradata文件,该如何还原Oracle数据呢?

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

C语言结构体,枚举,联合

系列文章目录 第一章 C语言基础知识 第二章 C语言控制语句 第三章 C语言函数详解 第四章 C语言数组详解 第五章 C语言操作符详解 第六章 C语言指针详解 第七章 C语言结构体详解 第八章 详解数据在内存中的存储 第九章 C语言指针进阶 文章目录 1. 结构体 1.1 声明结构…

URL解析

目录 URIURLURL语法相对URLURL中的转义 现在与未来PURL 在 URL出现之前&#xff0c;人们如果想访问网络中的资源&#xff0c;就需要使用不同的 应用程序&#xff0c;如共享文件需要使用 FTP程序&#xff0c;想要发送邮件必须使用 邮件程序&#xff0c;想要看新闻那只能使用…

华为认证云计算前景如何

互联网/移动互联网经历了高速发展的二十年&#xff0c;我们有幸一起见证了华为、阿里、腾讯、百度、字节跳动、京东、滴滴、拼多多等互联网公司的崛起&#xff0c;让普通技术人实现逆袭拿到高薪&#xff0c;也让小镇做题家们有了阶层跨越的机会。 但机会都是留给有准备的人&…

2024年内外贸一体化融合发展(长沙)交易会

2024年内外贸一体化融合发展&#xff08;长沙&#xff09;交易会 一、总体思路 充分发挥湖南作为全国内外贸一体化试点地区作用&#xff0c;坚持“政府主导、市场驱动、企业为主”的原则&#xff0c;以“助力双循环&#xff0c;拓展新市场&#xff0c;促进新消费”为主题&…