回 帖 发 新 帖 刷新版面

主题:求助2叉树后序线索化问题

完全没有头绪。。。想了一个下午了 比中序难多了
希望高手帮助 ~

回复列表 (共3个回复)

沙发

要写? OR只是看?

板凳

算法还是化?是程序吧?

3 楼

typedef enum PointerTag {Link, Thread };
typedef struct BiThrNode  {
    TElemType    data;
    struct BiThrNode *lchild,rchild;
    PointerTag    LTag,RTag;
}BiThrNode,*BiThrTree;

Status PostOrderThreading(BiThrTree &Thrt, BiThreeTree T)  {
    if(!(Thrt=(BiThrTree)malloc(sizeof(BiThrTree)))) exit(OVERFLOW);
    Thrt->LTag=Link;                        //Thrt头结点指针
    if(!T) Thrt->lchild=Thrt;               //空树,头结点左指针回指
    else  {
        Thrt->lchild=T;pre=Thrt;        //pre是静态指针
        PostThreading(T);               //后序遍历线索化
        if(!pre->rchild) { pre->RTag=Thread;pre->rchild=Thrt; }  //判定根结点的右子树是否为空。如果为空,指向头结点。
        Thrt->RTag=Thread;Thrt->rchild=pre;  //这里有点毛,Thrt->rchild在后序遍历线索化的过程中指向了后序遍历的第一个结点,这里修改使它指向最后一个结点,也就是根结点。如果树仅有根结点,那改和不改都是一样的。
        }
    return OK;
}//PostOrderThreading

void PostThreading(BiThrTree p)     {
    if(!p)  {
        PostThreading(p->lchild);  //左子树线索化
        PostThreading(p->rchild);//右子树线索化
        if(!p->lchild) {p->LTag=Thread; p->lchild=pre; }  //前驱线索
        if(!pre->rchild) {pre->RTag=Thread; p->rchild=p; } //后继线索
        pre=p;                //保持pre是p的前驱
        }
}//PostThreading

这个是我自己根据严版的中序遍历线索化写的。嘿嘿,不知道有没有错。
在严版书中说后序线索化的3种情况。
1)若结点x是二叉树的根,则其后继为空。(貌似这个情况是说没头结点的情况吧)
2)若结点x是其双亲的右孩子或是其双亲的左孩子且其双亲没有右子树,其后继为双亲结点。
3)若结点x是其双亲的左孩子,且其双亲有右子树,则其后继为双亲的右子树上按后序遍历列出的第一个结点。

这里我觉得第2)和3)的情况在后序遍历的递归调用中,其后序无论是其双亲或是其双亲右子树上按后序遍历列出的第一个结点。在程序中都可以表示为在访问(或者说线索化)x后,继续递归后序遍历要访问第一个结点。

我来回复

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