线索二叉树

  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 }
原文地址:https://www.cnblogs.com/hengli/p/2849593.html