线索二叉树
基本概念
typedef struct ThreadNode{
ElemType data;
struct ThreadNode *lchild, *rchild;
int ltag, rtag;
}ThreadNode,*ThreadTree;线索二叉树的构造

线索二叉树的遍历
Last updated
typedef struct ThreadNode{
ElemType data;
struct ThreadNode *lchild, *rchild;
int ltag, rtag;
}ThreadNode,*ThreadTree;
Last updated
void InThread(ThreadTree& p, ThreadTree& pre){//线索二叉树的根结点,指向前驱结点的指针
if( p != NULL){
InThread(p->lchild,pre); //递归,线索化左子树
if( p->lchild == NULL){ //左子树为空,建立前驱线索
p->lchild == pre;
p->ltag = 1;
}
if( pre != NULL && pre->rchild == NULL){
pre->rchild = p; //建立前驱结点的后继线索
pre->rtag = 1;
}
pre = p; //标记当前结点成为刚刚访问过得结点
InThread( p->rchild, pre); //递归,线索化右子树
}
}void CreateInThread(ThreadTree T){
ThreadTree pre = NULL;
if( T != NULL ){ //非空二叉树线索化
InThread(T,pre); //线索化二叉树
pre->rchild = NULL; //处理遍历的最后一个结点
pre->rtag = 1;
}
}ThreadNode* FirstNode(ThreadNode* p){
while( p->ltag == 0){
p = p->lchild;
}
return p;
}ThreadNode* NextNode(ThreadNode* p){
if( p->rtag == 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);
}
}ThreadNode* LastNode(ThreadNode* p){
while( p->rtag == 0 ){
p = p->rchild;
}
return p;
}ThreadNode* PreNode(ThreadNode* p){
if( p->ltag == 0){
return FirstNode(p->lchild);
}else{
return p->lchild;
}
}