原题参见july大神博客系列【微软面试100题】
题目描述:求一棵二叉树中相距最远的两个节点之间距离,“距离”定义为两个结点间“边”的个数
分析思路:最大距离可能是从根结点到某一叶子结点,也可能是从一个叶子结点到另一个叶子结点。对于前者,树的高度就是最大距离,对于后者,找到这两个结点的第一个公共祖先结点,最大距离即为祖先结点的左右子树高度之和。在实现的时候,取左子树的最远距离、右子树的最远距离、左子树高度与右子树高度之和的三者中的最大值作为树的最远距离。
参考代码如下:
int MaxDistance(Node* root)
{
int depth = 0;
return CoreFunction(root, depth);
}
int CoreFunction(Node* root, int &depth)
{
if( root == NULL)
{
depth = 0;
return 0;
}
//ld和rd获取左子树和右子树的高度
int ld = 0;
int rd = 0;
//获取左子树和右子树的最远距离
int maxleft = CoreFunction(root->left, ld);
int maxright = CoreFunction(root->right, rd);
depth = max(ld, rd) + 1 ;//更新当前结点的高度
//返回左子树的最远距离、右子树的最远距离、左子树高度与右子树高度之和中的最大值
return max(ld + rd , max(maxleft, maxtright));
}