今日主要总结一下,543. 二叉树的直径
题目:543. 二叉树的直径
题目描述:
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
示例 :
给定二叉树
1
/ \
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
注意:两结点之间的路径长度是以它们之间边的数目表示
L
本题重难点
这道题的重难点主要是要充分理解好题目,把求解二叉树的直径问题进行分解转化,从而最后判断出是使用二叉树的哪种遍历方式
- 题目说:一棵二叉树的直径长度是任意两个结点路径长度中的最大值,所以就把求整个二叉树的直径转化成求以任意一个节点作为根节点的一条二叉树的直径,
- 之后进一步分析转化问题:求每一条二叉树的「直径」长度,就是一个节点的左右子树的最大深度之和,把问题转化成比较常见的求二叉树最大深度的问题
- 这样分析下来,求二叉树最大深度就需要知道子树的最大深度,所以是个后序遍历,利用子树计算的结果自底向上得到答案!
一、正确解法
C++代码
class Solution {
public:
int maxDiameter = 0;
int maxDepth(TreeNode* node){
// 函数定义:求每个节点对应二叉树的最大深度,并且更新所求最大直径
if(!node) return 0;
int left = maxDepth(node->left);
int right = maxDepth(node->right);
int maxD = max(left, right) + 1;
int tmpDiameter = left + right;
maxDiameter = max(maxDiameter, tmpDiameter);
return maxD;
}
int diameterOfBinaryTree(TreeNode* root) {
maxDepth(root);
return maxDiameter;
}
};
总结
这道题的重难点主要是要充分理解好题目,把求解二叉树的直径问题进行分解转化,从而最后判断出是使用二叉树的哪种遍历方式
- 题目说:一棵二叉树的直径长度是任意两个结点路径长度中的最大值,所以就把求整个二叉树的直径转化成求以任意一个节点作为根节点的一条二叉树的直径,
- 之后进一步分析转化问题:求每一条二叉树的「直径」长度,就是一个节点的左右子树的最大深度之和,把问题转化成比较常见的求二叉树最大深度的问题
- 这样分析下来,求二叉树最大深度就需要知道子树的最大深度,所以是个后序遍历,利用子树计算的结果自底向上得到答案!
欢迎大家扫码关注本人公众号:编程复盘与思考随笔
(关注后可以免费获得本人在csdn发布的资源源码)
公众号主要记录编程和刷题时的总结复盘笔记和心得!并且分享读书、工作、生活中的一些思考感悟!