求树中节点的最大距离

求树中节点的最大距离。 

如上图所示,我们要求的距离是3/7到20之间的距离,为5。

我们需要从叶子节点开始计算,对于每一个父节点都要计算通过此节点的两个子节点的最大距离。我们用上溯的方法,具体过程如下:

3、7:depth(深度)为0,maxDis(最大距离)为0

5:depth(深度)为1,maxDis(最大距离)为2

12:depth(深度)为0,maxDis(最大距离)为0:

8:depth(深度)为1+1=2,maxDis(最大距离)为1+2=3


16、20:depth(深度)为0,maxDis(最大距离)为0

18:depth(深度)为1,maxDis(最大距离)为2


14:depth(深度)为2+1=3,maxDis(最大距离)为3+2=5


上面是第一种情况,还有第二种情况是最大距离不通过跟节点,在左子树或者。

还有一个关键的地方是距离的变更,如果最大距离不通过根节点,那么跟节点左右子树最大深度之后还没有其一个子树的最大距离大。

我们用递归的方法来求。由于上溯深度要加1,而最大距离则分为三中情况,1是没有子节点;2是仅有一个子节点;3是有两个子节点。对于大多数有两个子节点的情况,要在原来左右子树最大深度之和上加2(因为加上了两条边),而对于情况1,则加0;对于情况2,则加1。为统一计算,我们假设对于一个NULL的节点(如:叶节点的子节点),深度为

-1,最大距离为0。那么其父节点的深度为-1+1=0;而对于最大距离,一种是左右子树最大深度之和加2,即-1+-1+2=0,另一种便是其左右子树中得最大距离。所以在求最大距离时,我们需要比较着两种情况。所求经过某节点的最大距离是:

最大距离=max(max(左子树最大距离, 右子树最大距离), 左子树最大深度+左子树最大深度+2)。

上程序:

struct Node

{

    Node *lChild;

    Node *rChild;

};


struct Result

{

    int maxDis;

    int maxDepth;

};


Result getMaxDis(Tree * T)

{

    TreeNode * pNode = T;

    if(T == NULL)

    {

        Result empty = {0, -1};

    }

    Result lhs = getMaxDis(pNode->lChild);

    Result rhs = getMaxDis(pNode->rChild);

    Result result;

    result.maxDepth = std::max(lhs.maxDepth, rhs.maxDepth)+1;

    result.maxDis = std::max(std::max(lhs.maxDis, rhs.maxDis), lhs.maxDepth+rhs.maxDepth+2);

    return result;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值