首页 > 其他分享 >二叉树中的最大路径和(递归)

二叉树中的最大路径和(递归)

时间:2024-12-29 11:30:04浏览次数:8  
标签:node right TreeNode 递归 int 路径 二叉树 节点

二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 root ,返回其 最大路径和 。

 

示例 1:

输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

示例 2:

输入:root = [-10,9,20,null,null,15,7]
输出:42
解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int maxValue = INT_MIN;
    int maxGain(TreeNode* node){
        if(node==nullptr) return 0;
        //计算该节点的左子树的最大贡献值
        int leftGain=max(maxGain(node->left),0);
        //计算该节点的右子树的最大贡献值
        int rightGain=max(maxGain(node->right),0);
        // 当前节点的最大路径和为该节点的值与该节点的左右子树的最大贡献值之和
        int nodeMaxvalue = node->val + leftGain + rightGain;
        //更新最大路径和
        maxValue = max(maxValue,nodeMaxvalue);
        // 返回当前节点的最大贡献值
        return node->val+max(leftGain,rightGain);
    }
    int maxPathSum(TreeNode* root) {
        maxGain(root);
        return maxValue;
    }
};

 

标签:node,right,TreeNode,递归,int,路径,二叉树,节点
From: https://www.cnblogs.com/yueshengd/p/18638555

相关文章

  • 头歌实训数据结构与算法-二叉树及其应用(第7关:由前序和中序遍历序列构造二叉树)
    任务描述本关任务要求采用前序遍历序列和中序遍历序列构造二叉树。相关知识给定一棵二叉树的前序遍历序列和中序遍历序列可以构造出这棵二叉树。例如前序序列是ABDECFG,中序序列是DBEAFCG,那么这颗二叉树的结构如图1所示。树结点结构定义为:structBTNode{    c......
  • 在使用递归时,能中途退出递归吗?
    在前端开发中,当你使用递归时,确实可以在满足特定条件时中途退出递归。这通常是通过在递归函数中设置一个或多个退出条件来实现的。当满足这些条件时,函数将停止递归调用并返回结果。以下是一个简单的JavaScript递归函数示例,它计算一个数字的阶乘。在这个例子中,当n等于0时,递归将停止......
  • 请问递归可不可以使用多线程?为什么?
    递归可以使用多线程,但这并不常见,且需要谨慎处理。在前端开发中,JavaScript等语言本身是单线程的,但通过WebWorkers或其他技术可以实现多线程。然而,将递归与多线程结合使用可能会带来一些复杂性和挑战。复杂性增加:递归本身就已经是一种相对复杂的编程模式,因为它涉及到函数调用......
  • 深入探索哈夫曼编码与二叉树的遍历
    编码表(将字符转换成二进制01数字)定长的编码方式不定长的编码方式压缩率很高,但是会产生数据歧义哈夫曼编码出现的次数越多,权重分配的值越小。哈夫曼树,左1右0,转换成编码哈夫曼编码(压缩率高,数据不会产生歧义)哈夫曼编码----->二叉......
  • 106.从中序与后序遍历构造二叉树
    106.从中序与后序遍历构造二叉树中序:左根右后序:左右根思路:中序遍历需要定位根节点的坐标前序和后序需要定位子树根节点的坐标1.构造map方便通过root->value拿到该值在中序中的下标(in_root)2.从后序的最后一个值拿到当前root的value3.通过map拿到in_root4.构造此时结......
  • 【257. 二叉树的所有路径 简单】
    题目:给你一个二叉树的根节点root,按任意顺序,返回所有从根节点到叶子节点的路径。叶子节点是指没有子节点的节点。示例1:输入:root=[1,2,3,null,5]输出:[“1->2->5”,“1->3”]示例2:输入:root=[1]输出:[“1”]提示:树中节点的数目在范围[1,100]内-100<=N......
  • C中如何实现斐波那契数列的迭代和递归算法?
    在C语言中实现斐波那契数列的迭代和递归算法是学习编程和算法设计的重要部分。本文将详细介绍这两种方法的实现原理,并提供具体的代码示例。递归算法递归算法是通过函数调用自身来解决问题的一种方法。对于斐波那契数列,递归算法的实现基于其定义:第n项等于前两项之和。递归算法......
  • 【递归与回溯深度解析:经典题解精讲(下篇)】—— Leetcode
    文章目录有效的数独解数独单词搜索黄金矿工不同的路径|||有效的数独递归解法思路将每个数独的格子视为一个任务,依次检查每个格子是否合法。如果当前格子中的数字违反了数独规则(在行、列或3×3小方块中重复),直接返回False。递归检查下一个格子,直到所有格子都检......
  • 磁盘剩余空间大于80%时,删除某个路径下的文件
    #使用Shell脚本定期清理包含“202”的目录##简介使用Shell脚本检查磁盘使用情况,并自动删除路径下包含“202”的目录及其内容,。##实现创建一个简单的Shell脚本:1.**检查磁盘使用情况**:使用`df`命令获取当前磁盘使用率。2.**条件判断**:如果磁盘使用率超过设定阈值(例如......
  • 通过在 组策略管理控制台 中配置 AppLocker,可以非常有效地限制 PowerShell 脚本的执行
    在组策略管理控制台(GroupPolicyManagementConsole,GPMC)中配置AppLocker,可以有效地限制和控制哪些应用程序(包括PowerShell脚本)可以在计算机上执行。这是一种通过白名单策略确保只有已批准的应用程序能够运行的强大安全措施。配置AppLocker的步骤:1. 打开组策略管理控制......