回 帖 发 新 帖 刷新版面

主题:怎么查找树中两个叶子 p和q 的最近的共同祖先呢?

求源代码阿~~~
谢谢

回复列表 (共8个回复)

沙发

先写一下自己的想法:
这个要看你用什么方式来建立二叉树了 如果你建立的就是有双向的 就只是需要不停的往上搜
本人觉得还可以从根分别往这两个接点寻找路径并记录下来,然后比较就可以得到。

板凳


我想到了这个算法,就是,从根节点开始查找pq点,记录下路径,然后再取路径中最近的重合的点!但是,程序我还是没有实现了....

3 楼

试试做一个后序遍历

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 楼

用一张表记录目前有哪些‘祖先’,可以选两种策略:
1,从q结点开始,循环将q的父结点找出来,并添加到表中,再从p结点开始,第一个在表中能找到的祖先结点就是所求
2,交替往上寻找,q的父结点查查表,没有就添入,p的父结点查查表,没有就添入,直到能在表中找到,首次找到的就是所求

如果能知道结点的深度信息,就更好求了,好的算法取决于数据结构;如果连父结点都不能直接找到,那就只好从根搜索了。

5 楼

我写了一个
Node* search(Node* r){

6 楼

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 楼

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 楼

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;
}   

我来回复

您尚未登录,请登录后再回复。点此登录或注册