主题:怎么查找树中两个叶子 p和q 的最近的共同祖先呢?
madapeng250
[专家分:0] 发布于 2007-04-15 13:53:00
求源代码阿~~~
谢谢
回复列表 (共8个回复)
沙发
lishiyong110 [专家分:300] 发布于 2007-04-15 17:33:00
先写一下自己的想法:
这个要看你用什么方式来建立二叉树了 如果你建立的就是有双向的 就只是需要不停的往上搜
本人觉得还可以从根分别往这两个接点寻找路径并记录下来,然后比较就可以得到。
板凳
madapeng250 [专家分:0] 发布于 2007-04-19 13:50:00
我想到了这个算法,就是,从根节点开始查找pq点,记录下路径,然后再取路径中最近的重合的点!但是,程序我还是没有实现了....
3 楼
bpttc [专家分:8790] 发布于 2007-04-19 16:45:00
试试做一个后序遍历
bool Postorder( BinTree T, BinTree p, BinTree q )
{
bool l, r;
if ( NULL == T )
{
return false;
}
else if ( T == p || T == q )
{
return true;
}
else
{
l = Postorder( T->lchild, p, q );
r = Postorder( T->rchild, p, q );
if ( l && r )
{
T就是共同祖先,处理之;
return false;
}
else
{
return ( l || r );
}
}
}
PS:我只是简单的想了一下,并没有证实算法的正确性
4 楼
rickone [专家分:15390] 发布于 2007-04-21 10:36:00
用一张表记录目前有哪些‘祖先’,可以选两种策略:
1,从q结点开始,循环将q的父结点找出来,并添加到表中,再从p结点开始,第一个在表中能找到的祖先结点就是所求
2,交替往上寻找,q的父结点查查表,没有就添入,p的父结点查查表,没有就添入,直到能在表中找到,首次找到的就是所求
如果能知道结点的深度信息,就更好求了,好的算法取决于数据结构;如果连父结点都不能直接找到,那就只好从根搜索了。
5 楼
lt19870917 [专家分:750] 发布于 2007-04-21 23:03:00
我写了一个
Node* search(Node* r){
6 楼
lt19870917 [专家分:750] 发布于 2007-04-21 23:07:00
Node* search(Node* r){
mark(r);//这里是做标记,表示已经访问
search(r->R);
if(marked(p)&&marked(q)) return r->R;//marked(v)表示v已经访问
search(r->L);
if(marked(p)&&marked(q)) return r->R;
return r;
}
7 楼
lt19870917 [专家分:750] 发布于 2007-04-21 23:08:00
Node* search(Node* r){
mark(r);//这里是做标记,表示已经访问
search(r->R);
if(marked(p)&&marked(q)) return r->R;//marked(v)表示v已经访问
search(r->L);
if(marked(p)&&marked(q)) return r->L;
return r;
}
8 楼
lt19870917 [专家分:750] 发布于 2007-04-22 07:57:00
Node* search(Node* r){
if(r==NULL) return NULL;
mark(r);//这里是做标记,表示已经访问
search(r->R);
if(marked(p)&&marked(q)) return r->R;//marked(v)表示v已经访问
search(r->L);
if(marked(p)&&marked(q)) return r->L;
return r;
}
我来回复