求二叉树中节点的最大距离

发布时间:2019-06-04 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了求二叉树中节点的最大距离脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

考虑任意节点,以该节点为根,相聚最远的两个节点为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

   }

脚本宝典总结

以上是脚本宝典为你收集整理的求二叉树中节点的最大距离全部内容,希望文章能够帮你解决求二叉树中节点的最大距离所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: