您的位置:首页 > 其它

每天学习一算法系列(11) (求二叉树中节点的最大距离)

2011-05-06 15:52 537 查看
题目:求二叉树中节点的最大距离.

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

写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。

题目来源于:http://topic.csdn.net/u/20101011/16/2befbfd9-f3e4-41c5-bb31-814e9615832e.html

思路一:

题目要求一颗二叉树中两个节点之间的最大距离,由于父子节点之间边是双向的,所以这道题转换为求左子树的最大深度 + 右子树的最大深度就是二叉树中节点的最大距离。

例如:以下一颗树:

5

/ /

4 8

/ /

7 12

/

10

那么它的最大距离为4,即:4-->5-->8-->12-->10.其中"-->"的个数就是最大的距离数4.

代码如下:

/*----------------------------------
代码来源于书上.
Modified by yuucyf.       2011.05.06
-----------------------------------*/
// 数据结构定义
typedef struct NODE
{
NODE* psLeft;   // 左子树
NODE* psRight;  // 右子树
int nMaxLeft;  // 左子树中的最长距离
int nMaxRight; // 右子树中的最长距离
int nValue;    // 该节点的值

NODE()
{
nValue = nMaxLeft = nMaxRight = 0;
psLeft = psRight = NULL;
}

}S_BSTNode;

void	AddBSTreeNode(S_BSTNode* &pRoot, int nValue)
{
if (NULL == pRoot)
{
pRoot = new S_BSTNode;
assert(NULL != pRoot);
pRoot->nValue = nValue;
return;
}

if (pRoot->nValue > nValue)
{
AddBSTreeNode(pRoot->psLeft, nValue);
}
else if ( pRoot->nValue < nValue)
{
AddBSTreeNode(pRoot->psRight, nValue);
}
}

void	DeleteAllNode(S_BSTNode* pRoot)
{
if (NULL == pRoot)	return;

DeleteAllNode(pRoot->psLeft);
DeleteAllNode(pRoot->psRight);

delete pRoot;
}

int g_nMaxLen = 0;

// 寻找树中最长的两段距离
void FindMaxLen(NODE* pRoot)
{
// 遍历到叶子节点,返回
if(NULL == pRoot)
{
return;
}

// 如果左子树为空,那么该节点的左边最长距离为0
if(NULL == pRoot->psLeft)
{
pRoot->nMaxLeft = 0;
}

// 如果右子树为空,那么该节点的右边最长距离为0
if(NULL == pRoot->psRight)
{
pRoot->nMaxRight = 0;
}

// 如果左子树不为空,递归寻找左子树最长距离
if(pRoot->psLeft != NULL)
{
FindMaxLen(pRoot->psLeft);
}

// 如果右子树不为空,递归寻找右子树最长距离
if(pRoot->psRight != NULL)
{
FindMaxLen(pRoot->psRight);
}

// 计算左子树最长节点距离
if(pRoot->psLeft != NULL)
{
int nTempMax = 0;
if(pRoot->psLeft->nMaxLeft > pRoot->psLeft->nMaxRight)
{
nTempMax = pRoot->psLeft->nMaxLeft;
}
else
{
nTempMax = pRoot->psLeft->nMaxRight;
}

pRoot->nMaxLeft = nTempMax + 1;
}

// 计算右子树最长节点距离
if(pRoot->psRight != NULL)
{
int nTempMax = 0;
if(pRoot->psRight->nMaxLeft > pRoot->psRight->nMaxRight)
{
nTempMax = pRoot->psRight->nMaxLeft;
}
else
{
nTempMax = pRoot->psRight->nMaxRight;
}

pRoot->nMaxRight = nTempMax + 1;
}

// 更新最长距离
if((pRoot->nMaxLeft + pRoot->nMaxRight) > g_nMaxLen)
{
g_nMaxLen = pRoot->nMaxLeft + pRoot->nMaxRight;
}
}

int _tmain(int argc, _TCHAR* argv[])
{
S_BSTNode *pRoot = NULL;
AddBSTreeNode(pRoot, 5);
AddBSTreeNode(pRoot, 4);
AddBSTreeNode(pRoot, 8);
AddBSTreeNode(pRoot, 7);
AddBSTreeNode(pRoot, 12);
AddBSTreeNode(pRoot, 10);

FindMaxLen(pRoot);

cout << "Max distance is " << g_nMaxLen << endl;
DeleteAllNode(pRoot);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐