问题描述

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

示例

给定二叉树

1
/ \
2 3
/ \
4 5

返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
注意:两结点之间的路径长度是以它们之间边的数目表示。

解题思路

本题是递归求二叉树高度的变体,返回从某结点出发左右子树高度之和的最大值即是题设中的二叉树的直径。但被调用函数的返回值必须是树的高度,则不可在主函数中定义变量存储二叉树的直径。所以,代表直径的参数可以使用引用或者是引入全局变量。

代码实现

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
int MaxDepth(TreeNode* root,int &num)
{
if(root == NULL)
{
return 0;
}
int l = MaxDepth(root->left,num);
int r = MaxDepth(root->right,num);
num = max(num,l + r + 1); // 如果 l + r + 1 主函数return num - 1 初始num设置为1
return (max(l,r) + 1); // 返回树的深度
}
public:
int diameterOfBinaryTree(TreeNode* root) {
int num = 1; // 初始值为1
MaxDepth(root,num);
return num - 1; // return值为 num - 1
}
};

附:求二叉树高度的递归算法(C++)

int GetBiTreeLength(TreeNode* root)
{
if(foot == NULL)
return 0;
int l = GetBiTreeLength(root->left);
int r = GetBiTreeLength(root->right);
return max(l, r) + 1;
}