锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
#include<iostream>
2
using namespace std;
3
4
enum PointerTag
5

{
6
Link,Thread //鏋氫婦鍊糒ink鍜孴hread鍒嗗埆涓?錛?
7
};
8
9
struct BiThrNode //綰跨儲浜屽弶鏍戠殑緇撶偣綾誨瀷
10

{
11
char data;
12
PointerTag LTag; //宸︽爣蹇?/span>
13
PointerTag RTag; //鍙蟲爣蹇?/span>
14
BiThrNode *lchild; //宸﹀瀛愭寚閽?/span>
15
BiThrNode *rchild; //鍙沖瀛愭寚閽?/span>
16
};
17
18
typedef BiThrNode* BiThrTree;
19
BiThrNode *pre=NULL; //鍏ㄥ眬閲?/span>
20
21
void InOrderThreading(BiThrTree & Thrt,BiThrTree T);//綰跨儲鍖?/span>
22
void InThreading(BiThrTree p);//涓簭閬嶅巻綰跨儲鍖?/span>
23
bool PreOrderCreatBiTree(BiThrTree &T);//鍏堝簭寤虹珛鏍?/span>
24
void InOrderTraverse_Thr(BiThrTree T);//涓簭閬嶅巻綰跨儲鏍?/span>
25
26
int main()
27

{
28
BiThrTree T,Thrt;
29
printf("杈撳叆鍏堝簭搴忓垪('#'琛ㄧず絀鴻妭鐐?寤虹珛浜屽弶鏍戯細\n");
30
PreOrderCreatBiTree(T);//鍏堝簭寤虹珛鏍?/span>
31
InOrderThreading(Thrt,T);//涓簭綰跨儲鍖?/span>
32
printf("涓簭綰跨儲鍖栵紝涓簭閬嶅巻寰椾腑緙寮忥細\n");
33
InOrderTraverse_Thr(Thrt);//涓簭閬嶅巻綰跨儲鏍?/span>
34
printf("\n");
35
return 0;
36
}
37
38
void InOrderThreading(BiThrTree & Thrt,BiThrTree T)
39

{
40
Thrt=new BiThrNode;
41
Thrt->LTag=Link;
42
Thrt->RTag=Thread;
43
Thrt->rchild=Thrt;
44
if(!T) Thrt->lchild=Thrt;
45
else
{
46
Thrt->lchild=T;
47
pre=Thrt;
48
InThreading(T);
49
pre->rchild=Thrt;
50
pre->RTag=Thread;
51
Thrt->rchild=pre;
52
}
53
}
54
55
void InThreading(BiThrTree p)
56

{
57
if(p)
58
{
59
InThreading(p->lchild);
60
if(!p->lchild)
{ p->LTag=Thread; p->lchild=pre;}
61
if(!pre->rchild)
{ pre->RTag=Thread; pre->rchild=p; }
62
pre=p;
63
InThreading(p->rchild);
64
}
65
}
66
67
bool PreOrderCreatBiTree(BiThrTree &T)
68

{//璇ヨ妭鐐歸潪絀鴻繑鍥瀟rue錛屽弻浜茶妭鐐瑰搴旀爣蹇桳ink錛岀┖鏃惰繑鍥瀎alse錛屽弻浜茶妭鐐瑰搴旀爣蹇楀簲涓篢hread
69
char ch;
70
scanf("%c",&ch);
71
if(ch=='#')
72
{
73
T=NULL;
74
return false;
75
}else
{
76
T=new BiThrNode;
77
T->data=ch;
78
if(PreOrderCreatBiTree(T->lchild)) T->LTag=Link; //宸﹀瀛愬瓨鍦ㄥ垯宸︽爣蹇椾負Link
79
else T->LTag=Thread;
80
if(PreOrderCreatBiTree(T->rchild)) T->RTag=Link; //鍙沖瀛愬瓨鍦ㄥ垯鍙蟲爣蹇椾負Link
81
else T->RTag=Thread;
82
}
83
return true;
84
}
85
86
87
void InOrderTraverse_Thr(BiThrTree T)
88

{
89
BiThrNode *p;
90
p=T->lchild;
91
while(p!=T)
92
{
93
while(p->LTag==Link) p=p->lchild;
94
printf("%c",p->data);
95
while(p->RTag==Thread && p->rchild!=T) //if(p->RTag==Thread && p->rchild!=T)
96
{
97
p=p->rchild;
98
printf("%c",p->data);
99
}
100
p=p->rchild;
101
}
102
}