欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > [动态规划] 二叉树中的最大路径和##树形DP#DFS

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

2024/10/24 20:11:11 来源:https://blog.csdn.net/2301_79465388/article/details/142602762  浏览:    关键词:[动态规划] 二叉树中的最大路径和##树形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;}
};

完~

未经作者同意禁止转载 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com