题目描述:
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
示例 :
给定二叉树1
/ \
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。注意:两结点之间的路径长度是以它们之间边的数目表示。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/diameter-of-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析:
这是一道简单题,但是思路必须要清晰:递归函数f的作用是什么?递归函数f的作用:1.通过递归调用f,来计算左子树最大的路径长度l和右子树最大的路径长度r,l+r组成了一条从左子树叶子节点开始,经过当前节点,到达右子树叶子节点的路径,然后判断该路径是否为最大值,是的话就更新。返回值是mx(l,r)+1,因为作为当前节点作为子节点,也要向父节点提供从叶子节点到根节点的最大路径。
清楚了递归函数f的作用,剩下的就简单多了。
有看不懂的小伙伴,可以移步官方题解:
代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int maxlength=0;
int diameterOfBinaryTree(TreeNode* root) {
if(root==NULL) return 0;
f(root);
return maxlength;
}
// 递归调用f,计算左右子树的路径长度,然后将其相加,更新最大值,最后返回左右子树长度中最大的。
int f(TreeNode* root)
{
if(root==NULL) return 0;
int l=f(root->left);
int r=f(root->right)
// 判断以root为根节点的子树,其路径是否最大
if(maxlength<l+r) maxlength=l+r;
// 对于父节点来说,root只是其左/右节点,因此,要给父节点返回最长的那个路径
return max(l,r)+1;
}
};