1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <vector>
5 #include <stack>
6 #include <algorithm>
7 using namespace std;
8
9 typedef enum{
10 Thread,
11 Link
12 }Tag;
13
14 typedef struct Node
15 {
16 int data;
17 struct Node * lchild;
18 struct Node * rchild;
19 Tag rtag;
20 Tag ltag;
21 } Node;
22
23 Node *createNode(int data, Node * l = NULL, Node * r = NULL)
24 {
25 Node * res = (Node *)malloc(sizeof(Node));
26 res->data = data;
27 res->lchild = l;
28 res->rchild = r;
29 res->rtag = Link;
30 res->ltag = Link;
31 return res;
32 }
33
34
35 Node * createTree(Node * &root, int x)
36 {
37 if (root == NULL){
38 root = createNode(x, NULL, NULL);
39 return root;
40 }
41 Node * p = root;
42 Node * q = NULL;
43 while(p != NULL){
44 q = p;
45 if ( x > p->data ){
46 p = p->rchild;
47 }
48 else {
49 p = p->lchild;
50 }
51 }
52 if ( x > q->data) q->rchild = createNode(x);
53 else q->lchild = createNode(x);
54 return root;
55 }
56
57 void print(Node * root)
58 {
59 if (root == NULL) return;
60 print(root->lchild);
61 printf("%d\n", root->data);
62 print(root->rchild);
63 }
64
65 void mprint(Node * root)
66 {
67 Node * p = root;
68 stack<Node *> st;
69 st.push(root);
70 while (!st.empty()) {
71 if (st.top() == NULL) {
72 st.pop();
73 if (!st.empty()) {
74 printf("%d\n", st.top()->data);
75 Node * temp = st.top();
76 st.pop();
77 st.push(temp->rchild);
78 }
79 }
80 else {
81 st.push(st.top()->lchild);
82 }
83 }
84 }
85
86 void threadTree(Node *&prev, Node *root) {
87 if (root == NULL) return;
88 threadTree(prev, root->lchild);
89 if (root->lchild == NULL) {
90 root->lchild = prev;
91 root->ltag = Thread;
92 }
93 if (prev != NULL && prev->rchild == NULL) {
94 prev->rchild = root;
95 prev->rtag = Thread;
96 }
97 prev = root;
98 threadTree(prev, root->rchild);
99 }
100
101
102 int inThreadTreePrint(Node * root) {
103 Node * p = root;
104 while(p) {
105 if (p->lchild != NULL && p->ltag != Thread)
106 p = p->lchild;
107 else {
108 printf("%d\n", p->data);
109 while (p->rchild != NULL && p->rtag == Thread) {
110 p = p->rchild;
111 printf("%d\n", p->data);
112 }
113 p = p->rchild;
114 }
115 }
116 }
117
118
119
120 int main(void)
121 {
122 Node *root = NULL;
123 createTree(root, 5);
124 createTree(root, 4);
125 createTree(root, 9);
126 createTree(root, 7);
127 createTree(root, 1);
128 createTree(root, 2);
129 Node * prev = NULL;
130 threadTree(prev, root);
131 printf("%d ", root->lchild->data);
132 if (root->lchild->lchild) printf("%d ", root->lchild->lchild->data);
133 else printf("NULL ");
134 if (root->rchild->lchild->rchild) printf("%d ", root->rchild->lchild->rchild->data);
135 else printf("NULL ");
136 printf("\n");
137 printf("----------------------------------------------------\n");
138 inThreadTreePrint(root);
139 return 0;
140 }