找出二叉树中和最大的路径,路径可以从任意节点开始,到任意节点结束。

本文介绍了一种解决二叉树最大路径和问题的方法。该问题要求找出从任意节点开始和结束的最大路径总和。文章详细阐述了如何通过深度优先搜索(DFS)策略遍历二叉树,并比较左右子树的值来找到最大路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    题目:leetcode

    Given a binary tree, find the maximum path sum.

    The path may start and end at any node in the tree. For example: Given the below binary tree,
     1
     / \

   2  3

Return 6.

    提示:路径可以从任意节点开始,到任意节点结束。可以利用“最大连续子序列和”问题的思路,点击打开链接。如果说Array 只有一个方向的话,那么Binary Tree 其实只是左、右两个方向而已,我们需要比较两个方向上的值。不过,Array 可以从头到尾遍历,那么Binary Tree 怎么办呢,我们可以采用Binary Tree 最常用的DFS 来进行遍历。先算出左右子树的结果L 和R,如果L 大于0,那么对后续结果是有利的,我们加上L,如果R 大于0,对后续结果也是有利的,继续加上R。

    

bool g_IsRight=true;

int MaxPathSum_Core(int &maxnum,TreeNode* root)
{
	if(root==nullptr)
		return -1;
	int sum=root->val;
	int l=MaxPathSum_Core(maxnum,root->left);
	int r=MaxPathSum_Core(maxnum,root->right);
	if(l>0)
		sum+=l;
	if(r>0)
		sum+=r;
	maxnum=max(maxnum,sum);
	if(max(l,r)>0)
		return max(l,r)+root->val;
	else
		return root->val;

}

int MaxPathSum(TreeNode *root)
{
	 g_IsRight=true;
	if(root==nullptr)
	{
		 g_IsRight=false;
		 return 0;
	}
	int maxnum=root->val;
	MaxPathSum_Core(maxnum,root);
	return maxnum;
}

    注意在返回值无法表达输入不合法的情况时,加一个全局变量进行标志。MaxPathSum_Core最后return 的时候,只返回一个方向上的值,为什么?这是因为在递归中,只能向父节点返回,不可能存在L->root->R 的路径,只可能是L->root 或R->root。

### 计算二叉树最大带权路径和的算法 为了计算二叉树中的最大带权路径和,可以采用递归方法来遍历整棵树并记录每条可能路径上的权重总和。以下是详细的解释以及实现: #### 算法描述 定义一个函数 `maxPathSum` 来计算从当前节点到其子树内的任意一条路径最大权重和。对于每一个节点,考虑两种情况: 1. **单边路径**:仅通过左子树或右子树到达某个叶子节点。 2. **双边路径**:经过当前节点连接左子树和右子树形成的一条完整路径。 最终的结果是从根节点出发能够找到的最大路径和。需要注意的是,在某些情况下,可能存在负数权重的情况,因此需要特别处理这些场景以确保不会错误地增加路径权重。 下面是具体的 C++ 实现代码: ```cpp #include <iostream> #include <algorithm> // std::max using namespace std; // 定义二叉树结构体 struct TreeNode { int weight; TreeNode *left, *right; TreeNode(int val) : weight(val), left(nullptr), right(nullptr) {} }; class Solution { public: int max_sum = INT_MIN; // 初始化全局变量用于保存最大路径和 // 辅助函数:返回以当前节点为起点的最大贡献值(即单边路径int helper(TreeNode* node) { if (!node) return 0; // 如果为空,则不提供任何贡献 // 对于左右子树分别递归调用helper获取它们能提供的最大正向贡献 int left_gain = max(helper(node->left), 0); int right_gain = max(helper(node->right), 0); // 更新最大路径和 (当前节点作为最高点形成的路径) int price_newpath = node->weight + left_gain + right_gain; max_sum = max(max_sum, price_newpath); // 返回当前节点及其最佳一侧构成的路径所能带来的收益 return node->weight + max(left_gain, right_gain); } // 主函数入口 int findMaxPathSum(TreeNode* root) { helper(root); return max_sum; } }; ``` 上述程序实现了寻找二叉树中具有最大带权路径的功能,并且考虑到如果某一边的路径权重小于零则忽略它[^3]。 #### 复杂度分析 时间复杂度 O(N),其中 N 是节点的数量,因为每个节点只被访问一次;空间复杂度取决于栈深度,最坏的情况下也是O(H),H代表树的高度。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值