一棵树的深度的定义:一棵树中所有的点到根节点的距离最大值
算法
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就是树的直径了