//线索二叉树
//中序遍历线索二叉树 19
//tag为0 指示有孩子 tag为1说明有前驱或后继
BTNode *firstNode(BTNode *t){
    while(t->ltag==0){
        t=t->lchild;
    }
    return t;
}
BTNode* NextNode(BTNode *p){
    if(p->rtag==0)
        return firstNode(p->rchild);
    else{
        return p->rchild;
    }
}
void InOrder(BTNode *T){
    for(BTNode *p=firstNode(T);p!=null;p=NextNode(T)){
        visit(p);
    }
}

//中序逆向遍历中序线索二叉树
BTNode lastNode(BTNode *p){
    while(t->rtag==0){
        t=t->rchild;
    }
    return t;
}
BTNode PreNode(BTNode *p){
    if(p->ltag==0){
        return lastNode(p->lchild);
    }else{
        return p->lchild;
    }
}
void ReInOrder(BTNode *T){
    for(BTNode *p=lastNode(T);p!=null;p=PreNode(T)){
        visit(p);
    }
}

//中序线索二叉树 找指定结点在后序的前驱结点
//在后序序列中,若结点p有右孩子,则右子女是其前驱。
//若没有右子女有左孩子,则左孩子是其前驱。
//若都没有中序左线索指向某祖先f
//若f有左孩子,则左子女是结点p在后序的前驱
//若f无左孩子,则其前驱找双亲的双亲,一直找到有左子女的
//还有一种情况,p是中序的第一个结点,则p在中序和后序下都无前驱。
BTNode InPostPre(BTNode *T,BTNode *p){
    BTNode q;
    if(p->rtag==0){//有右孩子
        q=p->rchild;
    }else if(p->ltag==0){//有左孩子
        q=p->lchild;
    }else if(p->lchild==null){
        q=null;
    }else{
        while(p->ltag==1 && p->lchild!=null){
            p=p->lchild;
        }
        if(p->ltag==0){
            q=p->lchild;
        }else{
            q=null;
        }
    }
    return q;
}
12-16 15:21