✊✊✊大家好!本篇文章将较详细介绍二叉树的直径的相关题目,并进行代码实现。代码语言为:C++代码 。
给你一棵二叉树的根节点,返回该树的 直径 。
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 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)
1.临界条件: 叶子处为0,则当节点为空时返回-1;
2.遍历整个二叉树,先求出左右子树的最大链长,再处理。采用后续遍历的方法。
3.当前节点的直径长度=左子树最大链长+右子树最大链长+2.
4.返回父节点=max(左子树最大链长,右子树最大链长)+1
//后序遍历
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;
}
};
二叉树中的路径被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中至多出现一次。该路径 至少包含一个节点,且不一定经过根节点。
路径和是路径中各节点值的总和。
给你一个二叉树的根节点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)
与二叉树的直径类似,
1.临界条件: 叶子处为0,则当节点为空时返回-1;
2.遍历整个二叉树,先求出左右子树的最大链和,再处理。采用后续遍历的方法。
3.当前节点的最大路径和=左子树最大链和+右子树最大链和+ 当前节点值.
4.返回父节点=max(左子树最大链和,右子树最大链和)+当前节点值。如果返回值<0,返回0。
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;
}
};