昨天面试问到这个问题,这个问题在编程之美上见过,但是不记得过程了。没答上来。今天翻书看了。总结如下:
struct Node
{
Node *left;
Node *right;
int maxLeft;
int maxRight;
};
int maxLen = 0;
// 寻找树中最长的两段距离
void findMaxLen(Node *root)
{
// 遍历到叶子节点,返回
if (root == NULL)
return;
// 如果左子树为空,那么该节点的左边最长距离为0
if (root->left == NULL)
root->maxLeft = 0;
// 如果右子树为空,那么该节点的右边最长距离为0
if (root->right == NULL)
root->maxRight = 0;
// 如果左子树不为空,递归寻找左子树最长距离
if (root->left != NULL)
findMaxLen(root->left);
// 如果右子树不为空,递归寻找右子树最长距离
if (root->right != NULL)
findMaxLen(root->right);
// 计算左子树最长节点距离
if (root->left != NULL)
{
root->maxLeft = root->left->maxLeft > root->left->maxRight ? root->left->maxLeft + 1 : root->left->maxRight + 1;
}
// 计算右子树最长节点距离
if (root->right != NULL)
{
root->maxRight = root->right->maxLeft > root->right->maxRight ? root->right->maxLeft + 1 : root->right->maxRight + 1;
}
// 更新最长距离
if (root->maxLeft + root->maxRight > maxLen)
maxLen = root->maxLeft + root->maxRight;
}