struct TreeNode{
TreeNode * left;
TreeNode * right;
int val;
TreeNode(int _val, TreeNode * _left, TreeNode * _right) :
val(_val), left(_left), right(_right){}
TreeNode(int _val) :val(_val), left(NULL), right(NULL){}
};
struct Result{
int maxDistance;
int maxDepth;
Result(int _maxDistance, int _maxDepth) :
maxDistance(_maxDistance), maxDepth(_maxDepth){}
Result(){}
};
Result getMaxDis(TreeNode * root){
if (!root){
return Result(0, -1);
}
Result res;
Result resLeft = getMaxDis(root->left);
Result resRight = getMaxDis(root->right);
res.maxDepth = max(resLeft.maxDepth, resRight.maxDepth) + 1;
res.maxDistance = max(max(resLeft.maxDistance, resRight.maxDistance), resLeft.maxDepth + resRight.maxDepth + 2);
return res;
}
int getMaxDistance(TreeNode * root){
Result result = getMaxDis(root);
return max(result.maxDepth, result.maxDistance);
}
void longestPathUtil(Node* root, int& left_len, int& right_len, int& max_len);
int longestPath(Node* root)
{
int left_len, right_len, max_len;
longestPathUtil(root, left_len, right_len, max_len);
return max_len;
}
void longestPathUtil(Node* root, int& left_len, int& right_len, int& max_len)
{
if(root==NULL)
{
left_len = 0;
right_len = 0;
max_len = 0;
return;
}
int left_len1, right_len1, left_len2, right_len2;
longestPathUtil(root->left, left_len1, right_len1, max_len);
longestPathUtil(root->right, left_len2, right_len2, max_len);
left_len = 1+max(left_len1, right_len1);
right_len = 1+max(left_len2, right_len2);
max_len = max(left_len+right_len-1, max_len);
}