中序线索二叉树找中序后继:
在中序线索二叉树中找到指定结点*p的中序后继next
1.若p->tag=1,则next=p->rchild
2.若p->tag=0,则next=p的右子树中最左下结点。
//找到以p为根的子树中,第一个被中序遍历的结点
ThreadNode *Firstnode(ThreadNode *p){
//循环找到最左下结点(不一定是叶子结点)
while(p->ltag==0)
p=p->lchild;
return p;
}
//在中序线索二叉树中找到结点p的后继结点
ThreadNode *Nextnode(ThreadNode *p){
//右子树中最左下结点
if(p->ltag==0) //没有被线索化,返回右子树最左下结点
return Firstnode(p->rchild);
else
return p->rchild; //被线索化则直接返回右子树
}
//对中序线索二叉树进行中序遍历(利用线索实现的非递归算法)
void InOrder(ThreadNode *T){
for(ThreadNode *p=Firstnode(T);p!=NULL;p=Nextnode(P)){
visit(p);
}
中序线索二叉树找中序前驱:
在中序线索二叉树中找到指定结点*p的中序前驱pre
1.若p->ltag=1,则pre=p->lchild
2.p->ltag=0;
p一定有左孩子。pre=p的左子树中最右下结点
//找到以p为根的子树中,最后一个被中序遍历的结点
ThreadNode *Lastnode(ThreadNode *p){
while(p->rtag==0) //不一定是叶子结点
p=p->rchild;
return p;
}
//在中序线索二叉树中找到结点p的前驱结点
ThreadNode *Prenode(TheadNode *p){
//左子树中最右下结点
if(p->ltag==0)
return Lastnode(p->lchild);
else
return p->lchild; //ltag=1直接返回前驱线索
}
//对中序线索二叉树进行逆向中序遍历
void RecInorder(ThreadNode *T){
for(ThreadNode *p=Lastnode(T);p!=NULL;p=Prenode(p))
visit(p);
}