现在的位置: 首页 > 综合 > 正文

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

2013年10月08日 ⁄ 综合 ⁄ 共 1140字 ⁄ 字号 评论关闭

题目描述:

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

思路:递归应该是会想到的,求最大距离,这个两个节点可以同时在左子树或右子树,

或者分别在左右子树。

遍历树一般从根节点开始,可以对根节点这样考虑:

若左子树不为空,则取左子树的最大距离maxLeft;

若右子树不为空,则取右子树的最大距离maxRight;

最后的最大距离为maxLeft + maxRight;

(若有其中之一为空,则只需要考虑另外一个。)

然后,分别遍历左子树和右子树。

//定义一个结构体  
struct NODE  
{   
    NODE* pLeft;  
    NODE* pRight;  
    int MaxLen;  
    int MaxRgt;  
};    
NODE* pRoot;  //根节点  
int MaxLength;  
  
void traversal_MaxLen(NODE* pRoot)  
{  
    if(pRoot == NULL)  
    {  
        return 0;  
    };  
     
    if(pRoot->pLeft == NULL)     
    {  
        pRoot->MaxLeft = 0;  
    }  
    else                                 //若左子树不为空  
    {  
        int TempLen = 0;  
        if(pRoot->pLeft->MaxLeft > pRoot->pLeft->MaxRight)  
          //左子树上的,某一节点,往左边大,还是往右边大  
        {  
            TempLen+=pRoot->pLeft->MaxLeft;  
        }  
        else  
        {  
            TempLen+=pRoot->pLeft->MaxRight;  
        }  
        pRoot->nMaxLeft = TempLen + 1;  
        traversal_MaxLen(NODE* pRoot->pLeft);  
        //此处,加上递归  
    }    
    if(pRoot->pRigth == NULL)  
    {  
        pRoot->MaxRight = 0;  
    }  
    else                                //若右子树不为空  
    {  
        int TempLen = 0;  
        if(pRoot->pRight->MaxLeft > pRoot->pRight->MaxRight)   
        //右子树上的,某一节点,往左边大,还是往右边大  
        {  
            TempLen+=pRoot->pRight->MaxLeft;  
        }  
        else  
        {  
            TempLen+=pRoot->pRight->MaxRight;  
        }  
        pRoot->MaxRight = TempLen + 1;  
        traversal_MaxLen(NODE* pRoot->pRight);  
        //此处,加上递归  
    }  
     
   if(pRoot->MaxLeft + pRoot->MaxRight > 0)  
    {  
        MaxLength=pRoot->nMaxLeft + pRoot->MaxRight;  
    }  
} 

Reference:

http://blog.csdn.net/v_JULY_v/article/details/6301244

抱歉!评论已关闭.