void visit(ThreadNode*& p) {
if (p != NULL) {
if (p->lchild == NULL) {
p = pre;
p->ltag = 1;
}
if (pre != NULL && pre->rchild == NULL) {
pre->rchild = p;
pre->rtag = 1;
}
pre = p;
}
}
void InThread(ThreadNode* &T) {
InThread(T->lchild);
visit(T);
InThread(T->rchild);
}
void CreatThread(ThreadNode*& T) {
pre = NULL;
if (T != NULL) {
InThread(T);
if (pre->rchild == NULL) {
pre->rtag = 1;
}
}
}
#include<stdio.h>
#include<stdlib.h>
typedef struct BNode {
char data;
struct BNode* lchild, * rchild;
int ltag, rtag;
}*BiTree, BNode;
BNode* pre = NULL;
BiTree Create(BiTree& T) {
char c;
scanf_s("%c", &c);
if (c == '#')
T = NULL;
else {
T = (BiTree)malloc(sizeof(BNode));
T->data = c;
T->ltag = 0;
T->rtag = 0;
T->lchild = Create(T->lchild);
T->rchild = Create(T->rchild);
}
return T;
}
void ThreadBiTree(BiTree& p) {
if (p == NULL)
return;
ThreadBiTree(p->lchild);
if (p->lchild == NULL) {
p->ltag = 1;
p->lchild = pre;
}
if (pre != NULL && pre->rchild == NULL) {
pre->rtag = 1;
pre->rchild = p;
}
pre = p;
ThreadBiTree(p->rchild);
}
BiTree next(BiTree p) {
BiTree q;
if (p->rtag == 1) {
q = p->rchild;
}
else {
q = p->rchild;
while (q->ltag == 0) {
q = q->lchild;
}
}
return q;
}
void ThreadBiTreeTra(BiTree T) {
BiTree p;
if (T == NULL)
return;
p = T;
while (p->ltag == 0) {
p = p->lchild;
}
printf("%c", p->data);
while (p->rchild != NULL) {
p = next(p);
printf("%c", p->data);
}
}
int main() {
BiTree T;
Create(T);
ThreadBiTree(T);
ThreadBiTreeTra(T);
return 0;
}