二叉树系列——二叉树的最大距离

     题目:如果我们把二叉树看做图,父子节点之间的连线看成是双向的,我们姑且定义“距离”为两个节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。

  如下图所示,树中相距最远的两个节点为A,B,最大距离为6。

  

  情况A: 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点。
  情况B: 路径不穿过根节点,而是左子树或右子树的最大距离路径,取其大者

        

    求二叉树的深度的代码是比较简单的,代码如下:

  

 int DepthOfBinaryTree(BinaryTreeNode* pNode){
    if (pNode==NULL)
    {
        return 0;
    }
    else{  //递归
        return DepthOfBinaryTree(pNode->m_pLeft) > DepthOfBinaryTree(pNode->m_pRight) ?
               DepthOfBinaryTree(pNode->m_pLeft) + 1 : DepthOfBinaryTree(pNode->m_pRight) + 1;
    }
}

  

//改进的版本
int HeightOfBinaryTree(BinaryTreeNode*pNode, int&nMaxDistance){
    if (pNode == NULL)
        return -1;   //空节点的高度为-1
    //递归
    int nHeightOfLeftTree = HeightOfBinaryTree(pNode->m_pLeft, nMaxDistance) + 1;   //左子树的的高度加1
    int nHeightOfRightTree = HeightOfBinaryTree(pNode->m_pRight, nMaxDistance) + 1;   //右子树的高度加1
    int nDistance = nHeightOfLeftTree + nHeightOfRightTree;    //距离等于左子树的高度加上右子树的高度+2
    nMaxDistance = nMaxDistance > nDistance ? nMaxDistance : nDistance;            //得到距离的最大值
    return nHeightOfLeftTree > nHeightOfRightTree ? nHeightOfLeftTree : nHeightOfRightTree;
}

 

posted on 2019-09-16 20:46  溪水静幽  阅读(191)  评论(0)    收藏  举报