基本思想:
第一个访问的结点应该是最左下角的结点
假设刚才访问的结点是p
然后P的后继是谁?
若p->rchild是指针,说明P有右子树,下一个结点应该是P右子树中最左下角的结点
若p->rchild是线索,直接访问p->rchild
如此循环往复...
1 #include <iostream>
2 #include <stdio.h>
3
4 using namespace std;
5
6 typedef char TElemType;
7 enum PointerTag{ Link,Thread };//Link == 0 :指针,Thread == 1 :线索
8 typedef struct BiThrNode
9 {
10 TElemType data;
11 struct BiThrNode *lchild,*rchild;
12 PointerTag LTag,RTag;
13 }BiThrNode,*BiThrPtr;
14
15 BiThrPtr pre=NULL;//定义全局变量
16
17 //默认按前序遍历的顺序输入,尾结点用#表示
18 int Create_BiThrTree(BiThrPtr& T)
19 {
20 TElemType c;
21 //cout << "请输入当前节点元素值:" << endl;
22 cin>>c;
23 if(c == '#') T=NULL;
24 else
25 {
26 T = new BiThrNode;
27 T->data=c;
28 T->LTag=Link;
29 T->RTag=Link;
30 Create_BiThrTree(T->lchild);
31 Create_BiThrTree(T->rchild);
32 }
33 return 0;
34 }
35
36 //中序遍历输入各节点
37 int InOrderDisplay(BiThrPtr& T)
38 {
39 if(T)
40 {
41 InOrderDisplay(T->lchild);
42 cout << T->data <<" ";
43 InOrderDisplay(T->rchild);
44 }
45 return 0;
46 }
47
48
49 int InOrderTraverse(BiThrPtr& T)
50 {
51 extern BiThrPtr pre;//声明全局变量
52 if(T)
53 {
54 InOrderTraverse(T->lchild);
55 if(!T->lchild)
56 {
57 T->LTag = Thread;
58 T->lchild = pre;
59 }
60 if(!pre->rchild)
61 {
62 pre->RTag = Thread;
63 pre->rchild = T;
64 }
65 pre = T;
66 InOrderTraverse(T->rchild);
67 }
68 return 0;
69 }
70
71 int InOrderThreading(BiThrPtr &H,BiThrPtr& T)
72 {
73 H = new BiThrNode;//额外添加的头结点
74 H->data = '#';
75 H->LTag = Link;
76 H->RTag = Thread;
77 H->rchild = H;
78 if(!T)
79 {
80 H->lchild = H;
81 }
82 else
83 {
84 H->lchild = T;
85 pre = H;
86 InOrderTraverse(T);
87 pre->RTag = Thread;
88 pre->rchild = H;
89 H->rchild = pre;
90 }
91 return 0;
92 }
93
94
95 int InOrderTraverse_Thr(BiThrPtr H) //T为头节点
96 {
97 BiThrPtr p;
98 p = H->lchild; //p指向树根
99 while(p != H) //p等于T则说明已经遍历完毕
100 {
101 while(p->LTag == Link) //p->lchild为指针
102 p = p->lchild; //则向左下走到底
103 cout << p->data << " ";
104 while(p->RTag == Thread && p->rchild != H) //p->rchild为线索
105 {
106 p = p->rchild; //访问p->rchild
107 cout << p->data << " ";
108 }
109 p = p->rchild; //向右走
110 }
111 return 0;
112 }
113
114 int main()
115 {
116 freopen( "input.txt", "r", stdin );//从input.txt中读取输入数据
117 BiThrPtr T=NULL,H=NULL;
118 Create_BiThrTree(T);//前序遍历创建二叉树
119 InOrderDisplay(T);//用于验证下面的线索中序遍历输出结果是否正确
120 cout << endl;
121 InOrderThreading(H,T);
122 InOrderTraverse_Thr(H);
123 cout << endl;
124 fclose(stdin);
125 return 0;
126 }
txt中的测试数据:
ABC##D##E#F##
输出结果:C B D A E F