[c]代码库
#include<stdio.h>
#include<stdlib.h>
struct node {
int data;
struct node *lh,*rh;
int ltag,rtag;
}*pr,*t,*s[30];
struct node* creat() {
struct node *t,*q;
int i,x,j;
printf ( "i,x=" );
scanf ( "%d%d",&i,&x );
while ( ( i!=0 ) && ( x!=0 ) ) {
q= ( struct node * ) malloc ( sizeof ( struct node ) );
q->data=x;
q->lh=NULL;
q->rh=NULL;
s[i ]=q;
if ( i==1 )
t=q;
else {
j=i/2;
if ( ( i%2 ) ==0 )
s[j]->lh=q;
else
s[j]->rh=q;
}
printf ( "i,x=" );
scanf ( "%d%d",&i,&x );
}
return ( t );
}
/*void inthread(struct node *p) //递归算法
{
if(p!=NULL)
{
inthread(p->lh);
printf("%6d\t",p->data);
if(p->lh!=NULL)
p->ltag=0;
else
{
p->ltag=1;
p->lh=pr;
} //建立P节点的左线索,指向前趋节点PR
if(pr!=NULL)
{
if(pr->rh!=NULL)
pr->rtag=0;
else
{
pr->rtag=1;
pr->rh=p;
}//前趋节点PR建立左线索,指向节点P
}
pr=p;//pr跟上p,以便p向后移动
inthread(p->rh);
}
}*/
void inthread ( struct node *t ) { //非递归算法
int top,bools;
struct node *p;
pr=NULL;
p=t;
top=0;
bools=1;
do {
while ( p!=NULL ) {
top++;
s[top]=p;
p=p->lh;
}
if ( top==0 ) bools=0;
else {
p=s[top];
top--;
printf ( "%6d",p->data );
if ( p->lh!=NULL )
p->ltag=0;
else {
p->ltag=1;
p->lh=pr;
} //建立P节点的左线索,指向前趋节点PR
if ( pr!=NULL ) {
if ( pr->rh!=NULL )
pr->rtag=0;
else {
pr->rtag=1;
pr->rh=p;
}//前趋节点PR建立左线索,指向节点P
}
pr=p;//pr跟上p,以便p向后移动
p=p->rh;
}//END else
} while ( bools );
pr->rh=NULL;
}
main() {
pr=NULL;
t=creat();
inthread ( t );
pr->rh=NULL;
}