写一个程序求一棵二叉树中距离最远的两个节点的距离(假设距离即两个节点之间边的个数)
规律:相聚最远的两个节点一定是叶子节点。
考虑任意节点,以该节点为根,相聚最远的两个节点为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
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。