线索二叉树
以下是基本操作
#include "stdio.h"
#include "stdlib.h"
#define ElemType int
typedef struct ThreadNode{
ElemType data;
struct ThreadNode *rchild,*lchild;
int ltag,rtag;
}ThreadNode,*ThreadTree;
ThreadNode *pre=NULL;
//中序线索化
void visit1(ThreadNode *q){
if(q->lchild==NULL){
q->lchild=pre;
q->ltag=1;
}
if(pre!=NULL && pre->rchild==NULL){
pre->rchild=q;
pre->rtag=1;
}
pre=q;
}
void InThread(ThreadTree T){
if(T!=NULL){
InThread(T->lchild);
visit1(T);
InThread(T->rchild);
}
}
void CreateInThread(ThreadTree T){
pre=NULL;
if(T!=NULL){
InThread(T);
if(pre->rchild==NULL){
pre->rtag=1;
}
}
}
//先序线索化
void visit2(ThreadNode *q){
if(q->lchild==NULL){
q->lchild=pre;
q->ltag=1;
}
if(pre->rchild==NULL && pre!=NULL){
pre->rchild=q;
pre->rtag=1;
}
pre=q;
}
void PreThread(ThreadTree T){
if(T!=NULL)
{
visit2(T);
if(T->ltag==0)
PreThread(T->lchild);
PreThread(T->rchild);
}
}
void CreatePreThread(ThreadTree T){
if(T!=NULL)
{
PreThread(T);
if(pre->rchild==NULL)
pre->rtag=1;
}
}
//利用线索二叉树中序遍历
void visit(ThreadNode *q){
printf("%d",q->data);
}
ThreadNode *FirstNode(ThreadTree T){
while(T->ltag==0)
T=T->lchild;
return T;
}
ThreadNode * InNextNode(ThreadNode *p){
if(p->rtag==0){
return FirstNode(p->rchild);
}
if(p->rtag==1)
return p->rchild;
}
void InOrder(ThreadTree T){
for(ThreadNode *p=FirstNode(T);p!=NULL;p= InNextNode(p))
visit(p);
}
//利用线索二叉树逆向中序遍历
ThreadNode *LastNode(ThreadNode *p){
while(p->rtag==0)
p=p->rchild;
return p;
}
ThreadNode * InPreNode(ThreadNode *p){
if(p->ltag==0)
return LastNode(p->lchild);
if(p->ltag==1)
return p->lchild;
}
void RevInOrder(ThreadNode *T)
{
for(ThreadNode *p= LastNode(T);p!=NULL;p= InPreNode(p))
visit(p);
}
//利用线索二叉树先序遍历
ThreadNode * PreNextNode(ThreadNode *p){
if(p->rtag==1)
return p->rchild;
if(p->rtag==0)
{
if(p->ltag==0)
return p->lchild;
if(p->ltag==1)
return p->rchild;
}
}
void PreOrder(ThreadNode *T){
for(ThreadNode *p=T;p!=NULL;p= PreNextNode(p))
visit(p);
}
//先序前驱需要利用三叉链表通过找到父节点
//利用线索二叉树后序遍历
ThreadNode * LastPreNode(ThreadNode *p){
if(p->ltag==1)
return p->lchild;
if(p->ltag==0){
if(p->rtag==1)
return p->lchild;
if(p->rtag==0)
return p->rchild;
}
}
void LastOrder(ThreadTree T){
for(ThreadNode *p= FirstNode(T);p!=NULL;p= LastPreNode(p))
visit(p);
}
//后序后继需要利用三叉链表通过找到父节点
来一道小练习题
//习题5.18---在中序线索树中查找后序的前驱
ThreadNode * SeaPostpreNodeFroInTree(ThreadTree T,ThreadNode *p){
ThreadNode *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;
}