当前位置: 首页 > article >正文

力扣113:路径总和II

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。

示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]

示例 2:

输入:root = [1,2,3], targetSum = 5
输出:[]

示例 3:

输入:root = [1,2], targetSum = 0
输出:[]

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */


#define Maxsize 1024

// returnSize: 一个指针,用于返回满足条件的路径数量(即最终返回的二维数组的行数)
// returnColumnSizes: 一个指针,用于返回一个数组,该数组存储最终返回的二维数组中每条路径的长度(即二维数组中每列的长度)
// result: 二维整数数组指针,用于存储满足条件的路径数组
// temp: 整数数组,用于临时存储从根节点到当前节点遍历过程中的路径上的节点值
// NodeNum: 用于暂存当前路径上的节点数量
void DFS(struct TreeNode* root, int sum, int* returnSize, int** returnColumnSizes, int** result, int* temp, int NodeNum)
{
    // 如果当前节点的值等于目标和sum,并且当前节点是叶子节点(即没有左子节点且没有右子节点)
    if (root->val == sum && root->left == NULL && root->right == NULL)
    {
        // 将当前节点的值添加到临时路径数组temp中,并更新当前路径上的节点数量NodeNum
        temp[NodeNum++] = root->val;

        // 为当前满足条件的路径分配内存空间,大小为当前路径上的节点数量乘以每个节点值占用的空间
        result[*returnSize] = malloc(NodeNum * sizeof(int));

        // 将临时路径数组temp中的值复制到刚分配好的内存空间中,形成一条完整的满足条件的路径
        for (int i = 0; i < NodeNum; i++)
        {
            result[*returnSize][i] = temp[i];
        }

        // 将当前路径的长度(即NodeNum)存储到用于记录每条路径长度的数组returnColumnSizes中,并更新满足条件的路径数量*returnSize
        (*returnColumnSizes)[(*returnSize)++]= NodeNum;
    }
    else
    {
        // 将当前节点的值添加到临时路径数组temp中,并更新当前路径上的节点数量NodeNum
        temp[NodeNum++]= root->val;

        // 如果当前节点的左子节点不为空,递归调用DFS函数继续在左子树中寻找满足条件的路径
        // 此时目标和更新为sum减去当前节点的值,因为已经将当前节点的值加入到了路径中
        if (root->left!= NULL) DFS(root->left, sum - root->val, returnSize, returnColumnSizes, result, temp, NodeNum);

        // 如果当前节点的右子节点不为空,递归调用DFS函数继续在右子树中寻找满足条件的路径
        // 同样,目标和更新为sum减去当前节点的值
        if (root->right!= NULL) DFS(root->right, sum - root->val, returnSize, returnColumnSizes, result, temp, NodeNum);
    }
}


// returnSize: 一个指针,用于返回满足条件的路径数量(即最终返回的二维数组的行数)
// returnColumnSizes: 一个指针,用于返回一个数组,该数组存储最终返回的二维数组中每条路径的长度(即二维数组中每列的长度)
int** pathSum(struct TreeNode* root, int sum, int* returnSize, int** returnColumnSizes)
{
    // 如果根节点为空,说明是空树,直接返回NULL,表示没有找到满足条件的路径
    if (root == NULL) return NULL;

    // 定义一个整数数组temp,用于临时存储从根节点到当前节点遍历过程中的路径上的节点值,假设最多能容纳Maxsize个节点值
    int temp[Maxsize];

    // 初始化返回的二维整数数组,用于存储满足条件的路径数组,假设最多能容纳Maxsize条路径
    int** result = malloc(Maxsize * sizeof(int*));

    // 为用于记录每条路径长度的数组分配内存空间,假设最多能容纳Maxsize条路径的长度信息
    *returnColumnSizes = malloc(Maxsize * sizeof(int));

    // 初始化满足条件的路径数量为0
    *returnSize = 0;

    // 调用DFS函数开始在二叉树中深度优先搜索,寻找满足条件的路径
    DFS(root, sum, returnSize, returnColumnSizes, result, temp, 0);

    // 返回存储满足条件的路径的二维数组,调用者可以通过该数组获取所有满足条件的路径及其长度信息
    return result;
}


http://www.kler.cn/a/395149.html

相关文章:

  • Flink中自定义Source和Sink的使用
  • UAC2.0 speaker——同时支持 16bit,24bit 和 32bit
  • 利用编程语言和脚本编写技术,实现自动化渗透测试和安全工具的开发
  • 【大数据学习 | flume】flume的概述与组件的介绍
  • 山泽光纤HDMI线:铜线的隐藏力量
  • 实现 MVC 模式
  • 蓝领招聘二期笔记
  • 标题:网络安全:数字时代的守护盾
  • Python基础学习-07不可重复的set集合
  • 10款音频剪辑工具的个人实践体验感受!!
  • PG实例CPU使用率高排查思路
  • pyflink datastream数据流ds经过一系列转换后转为table,t_env.from_data_stream(ds)
  • 【C++学习(35)】在Linux中基于ucontext实现C++实现协程(Coroutine),基于C++20的co_await 协程的关键字实现协程
  • 机器学习在网络安全中的应用
  • 问:SQL优化,七条实践总结?
  • Rust枚举之卧龙凤雏(Rust Option枚举、Rust Result枚举)(Rust Enum、Some(T)、Ok(T)、Err(E))链式操作
  • TKinter实现与Dash应用的同步启停控制
  • kubernetes简单入门实战
  • 【大语言模型】ACL2024论文-10 CSCD-IME: 纠正拼音输入法产生的拼写错误
  • MathGPT的原理介绍,在中小学数学教学的应用场景,以及代码样例实现
  • Leetcode:3258. 统计满足 K 约束的子字符串数量 I
  • 什么是CRM系统?
  • 华为eNSP:RSTP
  • 【前端】vue 如何完全销毁一个组件
  • JavaScript 面试题
  • 助力网络安全发展,安全态势攻防赛事可视化