求两个节点之间最远的距离:
(1)两个节点都是叶子结点
(2)一个是叶子结点一个是根节点
思路:
(1)如果具有最远距离的两个节点经过了根节点,那么最远的距离就是左边最深的深度加上右边最深的深度之和。
(2)如果具有最远距离的两个节点之间的路径不经过根节点,那么最远的距离就在根节点的其中一个子树上的两个叶子结点。
int GetDistance(BinaryTreeNode*root, int &nMaxDistance){
if (pNode == NULL)
return -1; //空节点的高度为-1
//递归
int nHeightOfLeftTree = GetDistance(root->Left, nMaxDistance) + 1;
//左子树的的高度加1
int nHeightOfRightTree = GetDistance(root->Right, nMaxDistance) + 1;
//右子树的高度加1
int nDistance = nHeightOfLeftTree + nHeightOfRightTree;
//距离等于左子树的高度加上右子树的高度+2
nMaxDistance = nMaxDistance > nDistance ? nMaxDistance : nDistance;
//得到距离的最大值
return nHeightOfLeftTree > nHeightOfRightTree ? nHeightOfLeftTree : nHeightOfRightTree;
}
int GetFarDistance()
{
int distance = -1;
Height(_root,distance);
return distance;
}
int Height(Node* root, int& distance)
{
if (root == NULL)
{
return 0;
}
int leftH = Height(root->_left,distance);
int rightH = Height(root->_right,distance);
if (leftH+rightH > distance)
{
distance = leftH + rightH;
}
return leftH > rightH ? leftH+1 : rightH+1;
}