1
/ \
2 5
/ \ / \
3 4 6 7
以这棵树为例
[此贴子已经被作者于2006-6-1 19:43:30编辑过]
int i=0;
分别求出两点的层数m,n;指针pq分别指向这两点
int f(&m,&n,*p,*q){
if (m==n)
{
if(这两点是同一点)return(i);//返回的i的值就是距离
else { 指向两点的两指针p,q分别指向其双亲,m-=1;n-=1;i+=2; f(m,n,p,q) }
}
if (m!=n){
if (m>n){m-=1;i+=1;p指向其双亲;f(m,n,p,q)};
if (m<n){n-=1;i+=1;q指向其双亲;f(m,n,p,q)};
}
if(m<1或n<1)出错,这树不存在.
}
假设要求3和5之间的距离,分别求出3和5所在的层数,m=3,n=2,因为m>n,所以i+=1;m-=1;p指向2。这时m=2=n;由于2和5不是同一点,所以i+=2; p指向1,q指向1 。这时p,q指向同一点,返回i的值。
此时i=3;为3和5之间的距离。
[此贴子已经被作者于2006-6-1 22:40:55编辑过]
和我最开始的时候想的是一样的。不过这个算法不大完全,当一个节点是另一个节点的祖先时会多算2的距离。据个简单的例子,A是B的父亲,那么AB间距离为1。安照算法B首先找到A,+1,然后AB有共同的父亲,分别+1,那么算出来的距离就为3了。所以当AB到达同一深度的时候,有必要判断AB是不是同一个点,光判断是否有同一个父亲是不够的。