您的位置:首页 > 其它

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

2018-03-13 16:30 295 查看
编程之美中的一道题

编程之美中採用的解法是一种侵入式的

解法例如以下

struct NODE
{
NODE* pLeft;        // 左子树
NODE* pRight;       // 右子树
int nMaxLeft;       // 左子树中的最长距离
int nMaxRight;      // 右子树中的最长距离
char chValue;       // 该节点的值
};

int nMaxLen = 0;

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

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

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

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

// 假设右子树不为空。递归寻找右子树最长距离
if(pRoot -> pRight != NULL)
{
FindMaxLen(pRoot -> pRight);
}

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

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

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


我在解决问题时。想到的还有一个算法,推断一棵树是否是平衡二叉树,以下是我的解决方法,使用的php语言
public function getMaxDistance($node,&$Max){

if(null == $node){
return 0;
}

$left = $this->getMaxDistance($node->lchild,$Max);
$right = $this->getMaxDistance($node->rchild,$Max);

if($Max < ($left+$right)){
$Max = $left + $right;
}

return 1+($left>$right?

$left:$right);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: