LeetCode刷题——二叉树的直径、二叉树中的最大路径(HOT100)

本文详细介绍了如何使用C++解决LeetCode上的两个二叉树问题:1.计算二叉树的直径(最长路径长度),采用后序遍历计算左右子树的最大链长;2.找到二叉树中最大路径和,同样使用后序遍历,考虑路径和的累积和和剪枝策略。
摘要由CSDN通过智能技术生成

✊✊✊🌈大家好!本篇文章将较详细介绍二叉树的直径的相关题目,并进行代码实现。代码语言为:C++代码 😇。


543.二叉树的直径

🔒1、题目:

给你一棵二叉树的根节点,返回该树的 直径 。
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。
两节点之间路径的长度由它们之间边数表示。
🌲 示例 1🌲:

	输入:root = [1,2,3,4,5]
	输出:3
	解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。

🌲 示例 2🌲:

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

❗️ 提示 ❗️ :

	树中节点数目在范围 [1, 104] 内
	-100 <= Node.val <= 100

来源:力扣(LeetCode)👈

☀️2、思路:

1.临界条件: 叶子处为0,则当节点为空时返回-1;
2.遍历整个二叉树,先求出左右子树的最大链长,再处理。采用后续遍历的方法。
3.当前节点的直径长度=左子树最大链长+右子树最大链长+2.
4.返回父节点=max(左子树最大链长,右子树最大链长)+1

🔑3、代码:

//后序遍历
class Solution {
public:
    int diameterOfBinaryTree(TreeNode* root) {
        int result = 0;

        function<int(TreeNode*)> dfs=[&](TreeNode* root)->int{
            if(root == nullptr) return -1;
            int l_len = dfs(root->left)+1; //左子树最大链长+1
            int r_len = dfs(root->right)+1; // 右子树最大链长+1
            result = max(result,l_len+r_len);
            return max(l_len, r_len); //返回当前节点的最大链长
        };

        dfs(root);
        return result;
    }
};

124. 二叉树中的最大路径和

🔒1、题目:

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

路径和是路径中各节点值的总和。
给你一个二叉树的根节点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

❗️ 提示 ❗️ :

	树中节点数目范围是 [1, 3 * 104]
	-1000 <= Node.val <= 1000

来源:力扣(LeetCode)👈

☀️2、思路:

与二叉树的直径类似,

1.临界条件: 叶子处为0,则当节点为空时返回-1;
2.遍历整个二叉树,先求出左右子树的最大链和,再处理。采用后续遍历的方法。
3.当前节点的最大路径和=左子树最大链和+右子树最大链和+ 当前节点值.
4.返回父节点=max(左子树最大链和,右子树最大链和)+当前节点值。如果返回值<0,返回0。

🔑3、代码:

class Solution {
public:
    int maxPathSum(TreeNode* root) {
        int result = INT_MIN;

        function<int(TreeNode*)> dfs=[&](TreeNode* root)->int{
            if(root == nullptr) return 0;
            int l_len = dfs(root->left);
            int r_len = dfs(root->right);
            result = max(result, l_len + r_len + root->val);
            return max(max(l_len, r_len)+root->val,0);
        };
        dfs(root);
        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

君莫笑lucky

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

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

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

打赏作者

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

抵扣说明:

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

余额充值