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

news2024/9/28 15:28:00

题目

在这里插入图片描述
在这里插入图片描述
题目链接:
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);
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Navicat 干货 | 掌握 PostgreSQL 规则语法

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

笔记本电脑坏了硬盘数据会丢失吗 笔记本电脑坏了如何取出硬盘的资料 数据恢复软件

笔记本电脑对我们真的非常重要了&#xff0c;是实现无纸化办公和学习的重要工具&#xff0c;但是如果笔记本电脑坏了我们存储在电脑里的资料该怎么办&#xff1f;笔记本电脑坏了硬盘数据会丢失吗&#xff1f;相信有许多朋友都会有这样的担忧。本文今天就为大家解决笔记本电脑坏…

3月衣物清洁行业数据概况和趋势分析:总销额环比上涨超60%!

人们日常生活离不开衣物清洁产品&#xff0c;同时随着生活品质得提高和消费者健康意识得增强&#xff0c;对于衣物清洁行业的需求量与日俱增。作为日常必备的消耗品&#xff0c;衣物清洁产品备受消费者关注。借此&#xff0c;衣物清洁行业在3月份表现出稳定的发展态势。 根据鲸…

【软件测试】关于Web自动化测试

文章目录 &#x1f343;前言&#x1f332;如何实现Web自动化&#x1f6a9;安装驱动管理&#x1f6a9;Selenium库的安装 &#x1f333;自动化常用函数&#x1f6a9;元素的定位&#x1f388;cssSelector&#x1f388;xpath &#x1f6a9;操作测试对象&#x1f388;点击/提交对象—…

洗地机选哪个牌子好?过来人建议买这四款:性价比高质量好

随着生活节奏的加快&#xff0c;洗地机逐渐成为了人们生活中的清洁小能手&#xff0c;但市面上品牌众多&#xff0c;性能参差不齐&#xff0c;消费者往往难以抉择。在选择洗地机时&#xff0c;我们不仅要考虑其清洁效果&#xff0c;还应着重考察性价比。那么&#xff0c;面对如…

3.AlexNet--CNN经典网络模型详解(pytorch实现)

看博客AlexNet--CNN经典网络模型详解&#xff08;pytorch实现&#xff09;_alex的cnn-CSDN博客&#xff0c;该博客的作者写的很详细&#xff0c;是一个简单的目标分类的代码&#xff0c;可以通过该代码深入了解目标检测的简单框架。在这里不作详细的赘述&#xff0c;如果想更深…

[Meachines][Easy]Devvortex

Main $ nmap -p- 10.10.11.242 --min-rate 1000 # echo 10.10.11.242 devvortex.htb>>/etc/hosts 子域名爆破 $ apt install seclists $ wfuzz -c -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u "http://devvortex.htb/" -H &…

【Transformer】detr梳理

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 detr detr 1. 引言 论文&#xff1a; https://arxiv.org/pdf/2005.12872v3.pdf 时间&#xff1a; 2020.5.26 作者&#xff1a; Nicolas Carion?, Fra…

陈奂仁联手 The Sandbox 推出“Hamsterz Doodles”人物化身系列

全新人物化身系列结合艺术与实用性 开创元宇宙新篇章 著名亚洲唱作歌手兼香港电影金像奖得主陈奂仁携手 The Sandbox&#xff0c;兴奋地宣布推出新的元宇宙人物化身系列 —— Hamsterz Doodles 仓鼠涂鸦。 陈奂仁在 The Sandbox 推出 Hamsterz Doodles 系列&#xff0c;将艺术与…

智能家居—ESP32开发环境搭建

相关文章 毕业设计——基于ESP32的智能家居系统(语音识别、APP控制) 智能家居—ESP32开发环境搭建 一、下载安装二、验证三、资料获取 一、下载安装 下载安装 vscode 安装插件 创建工程 二、验证 写一个简单的函数来验证一下功能 void setup() {// put your setup c…

类和对象(2)——封装(封装的概念、包、staic)

前言 面向对象程序三大特性&#xff1a;封装、继承、多态。而类和对象阶段&#xff0c;主要研究的就是封装特性。何为封装呢&#xff1f;简单来说就是套壳屏蔽细节。 一、什么是封装 1.1 概念 将数据和操作数据的方法进行有机结合&#xff0c;隐藏对象的属性和实现细节&…

【码农圈子】想加免费的程序员微信群的看过来

群名&#xff1a;码农圈子 很多人后台反应&#xff0c;最近有没有免费的微信技术交流社群 。今天特意写一篇文章来创建一些只有程序猿的微信群。&#xff08;广告党慎入&#xff01;&#xff09; 这些微信技术群都是完全免费&#xff0c;后续也不会收取任何费用 。 群规则 …

Paragon NTFS如何手动更新? Paragon NTFS格式化硬盘会损失数据吗?

Paragon NTFS for Mac常被用于实现在Mac上读写NTFS格式硬盘&#xff0c;然而&#xff0c;有时用户可能会遇到软件无法自动更新的情况&#xff0c;需要进行手动更新操作。下面我们来看看Paragon NTFS如何手动更新&#xff0c;Paragon NTFS格式化硬盘会损失数据吗的相关内容。 一…

Python 使用 pip 安装 matplotlib 模块(精华版)

pip 安装 matplotlib 模块 1.使用pip安装matplotlib(五步实现):2.使用下载的matplotlib画图: 1.使用pip安装matplotlib(五步实现): 长话短说&#xff1a;本人下载 matplotlib 花了大概三个半小时屡屡碰壁&#xff0c;险些暴走。为了不让新来的小伙伴走我的弯路&#xff0c;特意…

【matlab 代码的python复现】 Matlab实现的滤波器设计实现与Python 的库函数相同实现Scipy

实现一个IIR滤波器的设计 背景 Matlab 设计的滤波器通常封装过于完整,虽然在DSP中能够实现更多功能的滤波器设计但是很难实现Python端口的实现。 我们以一段原始的生物电信号EEG信号进行处理。 EEG信号 1.信号获取 EEG信号通常通过头皮电极,经过多通道采样芯片采样,将获…

mysql面试题八(SQL语句)

目录 1.SQL 基本组成部分 常用操作示例 创建表 插入数据 查询数据 更新数据 删除数据 创建索引 授予用户权限 2.常见的聚合查询 1. 计数&#xff08;COUNT&#xff09; 2. 求和&#xff08;SUM&#xff09; 3. 平均值&#xff08;AVG&#xff09; 4. 最大值&…

使用FPGA实现超前进位加法器

介绍 前面已经向大家介绍过8位逐位进位加法器了&#xff0c;今天向大家介绍4位超前进位加法器。 对于逐位进位加法器来说&#xff0c;计算任意一位的加法运算时&#xff0c;必须等到低位的加法运算结束送来进位才能运行。这种加法器结构简单&#xff0c;但是运算慢。 对于超…

WSL安装-问题解决

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

钉钉报警的优势在哪里?如何配置钉钉机器人进行报警信息推送?

一、常见的报警方式 1、短信或者电话报警 这样的报警方式更适合高级别的报警提醒&#xff0c;用于处理紧急情况。出现级别不高而又频繁地发送短信会让人产生排斥感&#xff0c;而且电话或者短信的报警方式也存在一定的成本。 2、邮件报警 邮件报警更适用于工作时的提醒&…

支付方式模块代码示例

支付方式模块代码示例 效果展示 <view class"card"><uni-title type"h3" title"支付方式"></uni-title><radio-group change"radioChange"><label class"radio"><view class"zf-t…