C++语言: Codee#23233
001 #include <stdio.h>
002 #include <malloc.h>
003 #define MaxSize 100
004 typedef char ElemType;
005 typedef struct node
006 {
007 ElemType data;
008 int ltag, rtag; /*增加的线索标记*/
009 struct node *lchild;
010 struct node *rchild;
011 } TBTNode;
012 void CreateTBTNode(TBTNode * &b, char *str)
013 {
014 TBTNode *St[MaxSize], *p = NULL;
015 int top = -1, k, j = 0;
016 char ch;
017 b = NULL; /*建立的二叉树初始时为空*/
018 ch = str[j];
019 while (ch != '\0') /*str未扫描完时循环*/
020 {
021 switch(ch)
022 {
023 case '(':
024 top++;
025 St[top] = p;
026 k = 1;
027 break; /*为左结点*/
028 case ')':
029 top--;
030 break;
031 case ',':
032 k = 2;
033 break; /*为右结点*/
034 default:
035 p = (TBTNode *)malloc(sizeof(TBTNode));
036 p->data = ch;
037 p->lchild = p->rchild = NULL;
038 if (b == NULL) /**p为二叉树的根结点*/
039 b = p;
040 else /*已建立二叉树根结点*/
041 {
042 switch(k)
043 {
044 case 1:
045 St[top]->lchild = p;
046 break;
047 case 2:
048 St[top]->rchild = p;
049 break;
050 }
051 }
052 }
053 j++;
054 ch = str[j];
055 }
056 }
057 void DispTBTNode(TBTNode *b)
058 {
059 if (b != NULL)
060 {
061 printf("%c", b->data);
062 if (b->lchild != NULL || b->rchild != NULL)
063 {
064 printf("(");
065 DispTBTNode(b->lchild);
066 if (b->rchild != NULL) printf(",");
067 DispTBTNode(b->rchild);
068 printf(")");
069 }
070 }
071 }
072 TBTNode *pre; /*全局变量*/
073 void Thread(TBTNode *&p)
074 {
075 if (p != NULL)
076 {
077 Thread(p->lchild); /*左子树线索化*/
078 if (p->lchild == NULL) /*前驱线索*/
079 {
080 p->lchild = pre; /*建立当前结点的前驱线索*/
081 p->ltag = 1;
082 }
083 else p->ltag = 0;
084 if (pre->rchild == NULL) /*后继线索*/
085 {
086 pre->rchild = p; /*建立前驱结点的后继线索*/
087 pre->rtag = 1;
088 }
089 else pre->rtag = 0;
090 pre = p;
091 Thread(p->rchild); /*右子树线索化*/
092 }
093 }
094 TBTNode *CreaThread(TBTNode *b) /*中序线索化二叉树*/
095 {
096 TBTNode *root;
097 root = (TBTNode *)malloc(sizeof(TBTNode)); /*创建根结点*/
098 root->ltag = 0;
099 root->rtag = 1;
100 root->rchild = b;
101 if (b == NULL) /*空二叉树*/
102 root->lchild = root;
103 else
104 {
105 root->lchild = b;
106 pre = root; /*pre是*p的前驱结点,供加线索用*/
107 Thread(b); /*中序遍历线索化二叉树*/
108 pre->rchild = root; /*最后处理,加入指向根结点的线索*/
109 pre->rtag = 1;
110 root->rchild = pre; /*根结点右线索化*/
111 }
112 return root;
113 }
114 TBTNode* firstnode(TBTNode* p)
115 {
116 while(p->ltag == 0)
117 p = p->lchild;
118 return p;
119 }
120 TBTNode* nextnode(TBTNode* p)
121 {
122 if(p->rtag == 0)
123 return firstnode(p->rchild);
124 else
125 return p->rchild;
126 }
127 void inorder(TBTNode* root)
128 {
129 for(TBTNode* p = firstnode(root); p!=root; p = nextnode(p))
130 printf("%c ", p->data);
131 }
132
133 TBTNode* lastnode(TBTNode* p)
134 {
135 while(p->rtag == 0)
136 p = p->rchild;
137 return p;
138 }
139 TBTNode* prenode(TBTNode* p)
140 {
141 if(p->ltag == 0)
142 return lastnode(p->lchild);
143 else
144 return p->lchild;
145 }
146 void inorder_reverse(TBTNode* root)
147 {
148 for(TBTNode* p = lastnode(root); p != root; p = prenode(p))
149 printf("%c ", p->data);
150 }
151
152 int main()
153 {
154 TBTNode *b, *tb;
155 CreateTBTNode(b, "A(B(D(,G)),C(E,F))");
156 printf(" 二叉树:");
157 DispTBTNode(b);
158 printf("\n");
159 tb = CreaThread(b);
160 printf(" 线索中序序列:");
161 inorder(tb);
162 printf("\n中序自最后节点反向遍历:\n");
163 inorder_reverse(tb);
164 printf("\n");
002 #include <malloc.h>
003 #define MaxSize 100
004 typedef char ElemType;
005 typedef struct node
006 {
007 ElemType data;
008 int ltag, rtag; /*增加的线索标记*/
009 struct node *lchild;
010 struct node *rchild;
011 } TBTNode;
012 void CreateTBTNode(TBTNode * &b, char *str)
013 {
014 TBTNode *St[MaxSize], *p = NULL;
015 int top = -1, k, j = 0;
016 char ch;
017 b = NULL; /*建立的二叉树初始时为空*/
018 ch = str[j];
019 while (ch != '\0') /*str未扫描完时循环*/
020 {
021 switch(ch)
022 {
023 case '(':
024 top++;
025 St[top] = p;
026 k = 1;
027 break; /*为左结点*/
028 case ')':
029 top--;
030 break;
031 case ',':
032 k = 2;
033 break; /*为右结点*/
034 default:
035 p = (TBTNode *)malloc(sizeof(TBTNode));
036 p->data = ch;
037 p->lchild = p->rchild = NULL;
038 if (b == NULL) /**p为二叉树的根结点*/
039 b = p;
040 else /*已建立二叉树根结点*/
041 {
042 switch(k)
043 {
044 case 1:
045 St[top]->lchild = p;
046 break;
047 case 2:
048 St[top]->rchild = p;
049 break;
050 }
051 }
052 }
053 j++;
054 ch = str[j];
055 }
056 }
057 void DispTBTNode(TBTNode *b)
058 {
059 if (b != NULL)
060 {
061 printf("%c", b->data);
062 if (b->lchild != NULL || b->rchild != NULL)
063 {
064 printf("(");
065 DispTBTNode(b->lchild);
066 if (b->rchild != NULL) printf(",");
067 DispTBTNode(b->rchild);
068 printf(")");
069 }
070 }
071 }
072 TBTNode *pre; /*全局变量*/
073 void Thread(TBTNode *&p)
074 {
075 if (p != NULL)
076 {
077 Thread(p->lchild); /*左子树线索化*/
078 if (p->lchild == NULL) /*前驱线索*/
079 {
080 p->lchild = pre; /*建立当前结点的前驱线索*/
081 p->ltag = 1;
082 }
083 else p->ltag = 0;
084 if (pre->rchild == NULL) /*后继线索*/
085 {
086 pre->rchild = p; /*建立前驱结点的后继线索*/
087 pre->rtag = 1;
088 }
089 else pre->rtag = 0;
090 pre = p;
091 Thread(p->rchild); /*右子树线索化*/
092 }
093 }
094 TBTNode *CreaThread(TBTNode *b) /*中序线索化二叉树*/
095 {
096 TBTNode *root;
097 root = (TBTNode *)malloc(sizeof(TBTNode)); /*创建根结点*/
098 root->ltag = 0;
099 root->rtag = 1;
100 root->rchild = b;
101 if (b == NULL) /*空二叉树*/
102 root->lchild = root;
103 else
104 {
105 root->lchild = b;
106 pre = root; /*pre是*p的前驱结点,供加线索用*/
107 Thread(b); /*中序遍历线索化二叉树*/
108 pre->rchild = root; /*最后处理,加入指向根结点的线索*/
109 pre->rtag = 1;
110 root->rchild = pre; /*根结点右线索化*/
111 }
112 return root;
113 }
114 TBTNode* firstnode(TBTNode* p)
115 {
116 while(p->ltag == 0)
117 p = p->lchild;
118 return p;
119 }
120 TBTNode* nextnode(TBTNode* p)
121 {
122 if(p->rtag == 0)
123 return firstnode(p->rchild);
124 else
125 return p->rchild;
126 }
127 void inorder(TBTNode* root)
128 {
129 for(TBTNode* p = firstnode(root); p!=root; p = nextnode(p))
130 printf("%c ", p->data);
131 }
132
133 TBTNode* lastnode(TBTNode* p)
134 {
135 while(p->rtag == 0)
136 p = p->rchild;
137 return p;
138 }
139 TBTNode* prenode(TBTNode* p)
140 {
141 if(p->ltag == 0)
142 return lastnode(p->lchild);
143 else
144 return p->lchild;
145 }
146 void inorder_reverse(TBTNode* root)
147 {
148 for(TBTNode* p = lastnode(root); p != root; p = prenode(p))
149 printf("%c ", p->data);
150 }
151
152 int main()
153 {
154 TBTNode *b, *tb;
155 CreateTBTNode(b, "A(B(D(,G)),C(E,F))");
156 printf(" 二叉树:");
157 DispTBTNode(b);
158 printf("\n");
159 tb = CreaThread(b);
160 printf(" 线索中序序列:");
161 inorder(tb);
162 printf("\n中序自最后节点反向遍历:\n");
163 inorder_reverse(tb);
164 printf("\n");
165 }