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

LeetCode 543

给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。

示例 :
给定二叉树

          1
         / \
        2   3
       / \     
      4   5    
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。

注意:两结点之间的路径长度是以它们之间边的数目表示。
链接:https://leetcode-cn.com/problems/diameter-of-binary-tree

带拐弯的路径是由一个最高点的(拐点),只要对所有点枚举出通过该点的最长路径,然后取最大就可以了。

其实以某个结点为拐点的最长路径长度就是:以这个点为根节点的左右子树的最大深度和 - 1

此外,还需要维护一个变量ans,记录到当前位置枚举过的拐点中(一定包含该点)的最大路径
class Solution {
public:
    int ans = 0;
    int diameterOfBinaryTree(TreeNode* root) {
        dfs(root);
        return ans;
    }
    
    int dfs(TreeNode* root){  // 返回从root向下走的最大距离
        if (!root) return 0;
        
        auto left = dfs(root->left);
        auto right = dfs(root->right);
        
        ans = max(ans,left+right);  // 因为最大长度不一定是以根节点为拐点的,因此ans要对每个拐点都要和他的(left + right) 取一下max.至于距离为什么表示成 left + right 因为题目的两结点之间的路径长度是以它们之间边的数目表示。
        return max(left,right) + 1;  
    }
};

LeetCode 124

给定一个非空二叉树,返回其最大路径和。

本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

示例 1:

输入: [1,2,3]

       1
      / \
     2   3

输出: 6
链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum

class Solution {
public:
    
    int dfs(TreeNode* root,int &ans){ // 获得从root开始向下走的最大值
        if (!root) return 0;
        
       auto left = dfs(root->left,ans);
       auto right = dfs(root->right,ans);
        
        ans = max(ans,left + right + root -> val);
        
        return max(0,root->val + max(left,right)); // 如果root开始向下走的最大值都是负数,那么经过root的父节点的最大距离就包含root子树。
    }
    
    int maxPathSum(TreeNode* root) {
        int ans = -99999;
        dfs(root,ans);
        return ans;
    }
};


 

你可能感兴趣的:(Acwing,暑假算法,Leetcode)