#include <iostream>
#include<stack>
using namespace std;
struct node
{
int data;
struct node *left;
struct node *right;
};
struct node* newNode(int data)
{
struct node* node = (struct node*)
malloc(sizeof(struct node));
node->data = data;
node->left = NULL;
node->right = NULL;
return(node);
}
int max(int a,int b)
{
if(a>=b)return a;
else return b;
}
int diameter(struct node *root,int *height)
{
if(!root){ *height=0; return 0;}
int ls,rs,lh,rh;
rs=0;ls=0;lh=0;rh=0;
ls=diameter(root->left,&lh);
rs=diameter(root->right,&rh);
*height=max(lh,rh)+1;
return max(lh+rh+1,max(ls,rs));
}
int main()
{
struct node *root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
int height;
printf("%d",diameter(root,&height));
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZTxzdGFjaz4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKc3RydWN0IG5vZGUKewoJaW50IGRhdGE7CglzdHJ1Y3Qgbm9kZSAqbGVmdDsKCXN0cnVjdCBub2RlICpyaWdodDsKfTsKc3RydWN0IG5vZGUqIG5ld05vZGUoaW50IGRhdGEpCiAKewogIHN0cnVjdCBub2RlKiBub2RlID0gKHN0cnVjdCBub2RlKikKICAgICAgICAgICAgICAgICAgICAgICBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBub2RlKSk7CiAgbm9kZS0+ZGF0YSA9IGRhdGE7CiAgbm9kZS0+bGVmdCA9IE5VTEw7CiAgbm9kZS0+cmlnaHQgPSBOVUxMOwogCiAgcmV0dXJuKG5vZGUpOwp9CmludCBtYXgoaW50IGEsaW50IGIpCnsKCWlmKGE+PWIpcmV0dXJuIGE7CgllbHNlIHJldHVybiBiOwp9CmludCBkaWFtZXRlcihzdHJ1Y3Qgbm9kZSAqcm9vdCxpbnQgKmhlaWdodCkKewoJaWYoIXJvb3QpeyAqaGVpZ2h0PTA7IHJldHVybiAwO30KCWludCBscyxycyxsaCxyaDsKCXJzPTA7bHM9MDtsaD0wO3JoPTA7CgkgbHM9ZGlhbWV0ZXIocm9vdC0+bGVmdCwmbGgpOwoJIHJzPWRpYW1ldGVyKHJvb3QtPnJpZ2h0LCZyaCk7CgkgKmhlaWdodD1tYXgobGgscmgpKzE7CgkgcmV0dXJuIG1heChsaCtyaCsxLG1heChscyxycykpOwp9CmludCBtYWluKCkKewogIHN0cnVjdCBub2RlICpyb290ID0gbmV3Tm9kZSgxKTsKICByb290LT5sZWZ0ICAgICAgICA9IG5ld05vZGUoMik7CiAgcm9vdC0+cmlnaHQgICAgICAgPSBuZXdOb2RlKDMpOwogIHJvb3QtPmxlZnQtPmxlZnQgID0gbmV3Tm9kZSg0KTsKICByb290LT5sZWZ0LT5yaWdodCA9IG5ld05vZGUoNSk7IAogaW50IGhlaWdodDsKICBwcmludGYoIiVkIixkaWFtZXRlcihyb290LCZoZWlnaHQpKTsKIAogCiAgcmV0dXJuIDA7ICAKfQ==