求解一棵树的直径

一棵树的深度的定义:一棵树中所有的点到根节点的距离最大值
算法
1. 如果一棵树只有一个根节点,返回深度为  0 ,直径为  0
2. 否则,遍历一棵树的根节点的所有的子节点,利用本方法求出所有子树深度中最大的两个  n1>=n2 以及所有子树中直径最大值  m
3. n1  1 作为本树的深度返回
4. 如果 n1+n2+2>m,  则将 n1+n2+2 作为本树的直径返回,否则将  m 作为本树的直径返回

基本伪代码实现:
int[]  solve(Node root){
     Node son;
     bool haveson=false;
     int[] test;
     test[0]=0;//  树的直径
test[1]=0;// 树的深度
while(son=root.next()){
    test=solve(son);
    if(test[0]>m)m=test[0];// 子树的直径最大值更新
    if(test[1]>n2){
        if(test[1]>n1){// 这个子树的深度最大 , 深度更新
   n2=n1;
n1=test[1];
}
else n2=test[1];//  这个子树的深度比最大的小,但是比第二大的大
}
}
If(haveson==false)return test;// 说明没有子节点
test[1]=n1+1;// 本树的深度
if(n1+n2+2>m)test[0]=n1+n2+2;// 求得本树的直径
else test[0]=m;
return test;
}

当然还有课上老师还有说更简单的算法,比如先任选一点找出离这个点最远的点,这就是这个树的直径的一个端点A,再找离A最远的点B,这样AB就是树的直径了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值