不带头结点版
#include<stdio.h>
#include<malloc.h>
typedef char ElemType;
typedef struct BTree{
ElemType key;
struct BTree *lchild,*rchild;
int ltag,rtag;
}BTree;
BTree* CreateBTree()
{
BTree *p = NULL;
ElemType ch;
ch = getchar();
if(ch!='#'){
p = (BTree*)malloc(sizeof(BTree));
p->key = ch;
p->ltag = 0;
p->rtag = 0;
p->lchild = CreateBTree();
p->rchild = CreateBTree();
}
return p;
}
void InOrderThreaeding(BTree *bt)
{
static BTree *pre = NULL;
if(bt){
InOrderThreaeding(bt->lchild);
if(!bt->lchild){
bt->ltag = 1;
bt->lchild = pre;
}
if(pre&&!pre->rchild){
pre->rtag = 1;
pre->rchild = bt;
}
pre = bt;
InOrderThreaeding(bt->rchild);
}
}
BTree* Prior(BTree *bt)
{
BTree *tmp;
if(!bt)
tmp = NULL;
if(bt->ltag == 1)
tmp = bt->lchild;
else{
bt = bt->lchild;
while(bt->rchild){
bt = bt->rchild;
}
tmp = bt;
}
return tmp;
}
BTree* FirstNode(BTree *bt)
{
if(!bt)
return NULL;
while(bt->ltag == 0)
bt = bt->lchild;
return bt;
}
BTree* Next(BTree *bt)
{
if(bt->rtag == 1)
return bt->rchild;
else{
return FirstNode(bt->rchild);
}
}
void InOrderThreadingTraverse(BTree *bt)
{
bt = FirstNode(bt);
while(bt){
printf("%c ",bt->key);
bt = Next(bt);
}
}
int main()
{
BTree *bt;
bt = CreateBTree();
InOrderThreaeding(bt);
InOrderThreadingTraverse(bt);
return 0;
}
带头结点版
#include<stdio.h>
#include<malloc.h>
typedef char ElemType;
typedef struct BTree{
ElemType key;
struct BTree *lchild,*rchild;
int ltag,rtag;
}BTree;
BTree* CreateBTree()
{
BTree *p = NULL;
ElemType ch;
ch = getchar();
if(ch!='#'){
p = (BTree*)malloc(sizeof(BTree));
p->key = ch;
p->ltag = 0;
p->rtag = 0;
p->lchild = CreateBTree();
p->rchild = CreateBTree();
}
return p;
}
BTree* pre;
void InThreading(BTree *p)
{
if(p){
InThreading(p->lchild);
if(!p->lchild){
p->ltag = 1;
p->lchild = pre;
}
if(pre && !pre->rchild){
pre->rtag = 1;
pre->rchild = p;
}
pre = p;
InThreading(p->rchild);
}
}
BTree* InOrderThreading(BTree *bt)
{
BTree *Head;
Head = (BTree*)malloc(sizeof(BTree));
if(!Head){
printf("分配失败.\n");
return NULL;
}
Head->ltag = 0;
Head->rtag = 1;
Head->rchild = Head;
if(bt == NULL){
Head->lchild = Head;
}
else{
Head->lchild = bt;
InThreading(bt);
Head->rchild = pre;
pre->rtag = 1;
pre->rchild = Head;
}
return Head;
}
void InOrderThreadingTraverse(BTree *Head)
{
BTree *tmp;
tmp = Head->lchild;
while(tmp != Head){
while(tmp->ltag == 0){
tmp = tmp->lchild;
}
printf("%c ",tmp->key);
while(tmp->rtag == 1 && tmp->rchild != Head){
tmp = tmp->rchild;
printf("%c ",tmp->key);
}
tmp = tmp->rchild;
}
}
int main()
{
BTree *bt;
bt = CreateBTree();
bt = InOrderThreading(bt);
InOrderThreadingTraverse(bt);
return 0;
}