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

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


导航小助手

    • 543.二叉树的直径
      • 1、题目:
      • ☀️2、思路:
      • 3、代码:
    • 124. 二叉树中的最大路径和
      • 1、题目:
      • ☀️2、思路:
      • 3、代码:

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;
    }
};

你可能感兴趣的:(c++学习,hot,100,leetcode,算法,深度优先)