写一个程序求一棵二叉树中距离最远的两个节点的距离(假设距离即两个节点之间边的个数)

规律:相聚最远的两个节点一定是叶子节点。

考虑任意节点,以该节点为根,相聚最远的两个节点为U,V与这个根的关系有两种情况:
1.如果路径经过root,U,V是属于不同子树的,而且是距离子树的根最远的节点
2.若不经过root,U,V一定是以root的子节点为root的某棵树中距离最远的节点

设第K棵子树中,U,V的距离为d(Uk,Vk),那么Uk或者Vk就是该子树中节点到root的最远距离,将其定义为d(Ui,R)(1<=i<=K),取其中最大的两个值max1和max2,那么经过节点R的最长路径为max1+max2+2。所以相距最远的两个节点的距离为:max{d(U1,V1),d(U2,V2)...max1+max2+2}

采用深度优先搜索,遍历所有节点一次。

    //首先定义一个数据结构
    struct NODE
    {
        NODE* pLeft;
        NODE* pRight;
        int nMaxLeft;   //左子树中最长距离
        int nMaxRight;  //右子树中最长的距离
        char Value;
     }

     int nmaxlen = 0;

     //寻找树中最长的两段距离(Ui,Vi)
     void FindMaxLen(NODE* pRoot)
     {
         if(pRoot == NUll)
             return;
         if(pRoot -> pLeft == NULL)
             pRoot -> nMaxleft  = 0;
         if(pRoot -> pRight == NULL)
             pRoot -> nMaxRight  = 0;
         if(pRoot -> pLeft != NULL)
             FindMaxLen(pRoot->pLeft);
         if(pRoot -> pRight != NUll)
             FinfMaxLen(pRoot->pRight);
         //更新左子树最长距离
         if(pRoot -> pLeft != NULL)
         {
             int TempMax = 0;
             if(pRoot -> pLeft->nMaxLeft > pRoot -> pLeft->nMaxRight)
                 TempMax = pRoot -> pLeft->nMaxLeft;
             else
                 TempMax = pRoot -> pLeft->nMaxRight;
             pRoot->nMaxLeft = TempMax + 1;
         }
         //右子树类似,代码略

         //更新最长的距离
         if(pRoot->nMaxLeft + pRoot->nMaxRight > nmaxlen)
             nmaxlen = pRoot->nMaxLeft + pRoot->nMaxRight

   }


宇宙飞床M
49 声望5 粉丝

酷的要死


引用和评论

0 条评论