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