//线索二叉树 //中序遍历线索二叉树 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; }