[动态规划] 二叉树中的最大路径和##树形DP#DFS

标题:[动态规划] 二叉树中的最大路径和##树形DP#DFS

个人主页@水墨不写bug

(图片来源于网络)


目录

一 、什么是树形DP

 二、题目描述(点击题目转跳至题目)

NC6 二叉树中的最大路径和

 算法思路:

 讲解与参考代码:


正文开始:

 
 
//                          _ooOoo_                               //
//                         o8888888o                              //
//                         88" . "88                              //
//                         (| ^_^ |)                              //
//                         O\  =  /O                              //
//                      ____/`---'\____                           //
//                    .'  \\|     |//  `.                         //
//                   /  \\|||  :  |||//  \                        //
//                  /  _||||| -:- |||||-  \                       //
//                  |   | \\\  -  /// |   |                       //
//                  | \_|  ''\---/''  |   |                       //
//                  \  .-\__  `-`  ___/-. /                       //
//                ___`. .'  /--.--\  `. . ___                     //
//              ."" '<  `.___\_<|>_/___.'  >'"".                  //
//            | | :  `- \`.;`\ _ /`;.`/ - ` : | |                 //
//            \  \ `-.   \_ __\ /__ _/   .-` /  /                 //
//      ========`-.____`-.___\_____/___.-`____.-'========         //
//                           `=---='                              //
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //
//         佛祖保佑       永无BUG     永不修改                      //
 

一 、什么是树形DP

        动态规划(Dynamic Programming)是一种用于解决优化问题的算法思想。它通过将问题分解为子问题,并保存子问题的解,从而避免了重复计算。而树形DP是动态规划的一种具体应用,用于解决树状结构上的问题。 

        在树形DP中,我们通常会使用深度优先搜索(DFS)的方式来遍历树的节点,并根据遍历的顺序计算每个节点的dp值。

 二、题目描述(点击题目转跳至题目)

NC6 二叉树中的最大路径和

二叉树里面的路径被定义为:从该树的任意节点出发,经过父=>子或者子=>父的连接,达到任意节点的序列。

注意:

        1.同一个节点在一条二叉树路径里中最多出现一次

        2.一条路径至少包含一个节点,且不一定经过根节点

给定一个二叉树的根节点root,请你计算它的最大路径和;

例如:
给出以下的二叉树,
 


最优路径是:2=>1=>3,或者3=>1=>2,最大路径和=2+1+3=6

数据范围:节点数满足 1≤𝑛≤1051≤n≤105 ,节点上的值满足 ∣𝑣𝑎𝑙∣≤1000∣val∣≤1000

要求:空间复杂度 𝑂(1)O(1),时间复杂度 𝑂(𝑛)O(n)

示例1

输入:

{1,2,3}

返回值:

6

示例2

输入:

{-20,8,20,#,#,15,6}

返回值:

41
说明:

其中一条最大路径为:15=>20=>6,路径和为15+20+6=41   

示例3

输入:

{-2,#,-3}

返回值:

-2

 算法思路:

树形dp:

         a. 左子树收集:以左子树为起点的最大单链和;

        b. 右子树收集:以右子树为起点的最大单链和;

        c. 根节点要做的事情:整合左右子树的信息,得到经过根节点的最大路径和;

        d. 向上返回:以根节点为起点的最大单链和 

 讲解与参考代码:

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    //树形dp,dfs
    //找到左(右)子树为根的最大链和

    //由于val的返回的绝对值小于1000,所以将ret初始化为负无穷小,在这里-1001即可满足条件
    int ret = -1001;
    
    int dfs(TreeNode* root)
    {
        if(root == nullptr)
            return 0;
        
        //细节:如果子树的最大路径和小于0,则直接返回0即可,不再向上返回
        int l = max(0,dfs(root->left));
        int r = max(0,dfs(root->right));
        
        ret = max(ret,root->val + l + r);
        return root->val + max(l,r);
    }

    int maxPathSum(TreeNode* root) {
        dfs(root);
        return ret;
    }
};

完~

未经作者同意禁止转载 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

水墨不写bug

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

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

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

打赏作者

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

抵扣说明:

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

余额充值