#include <iostream>
using namespace std;
#define Elemtype char
typedef struct BiTNode {
Elemtype data;
struct BiTNode *lchild, *rchild;
int LTag, RTag;
} BiThreadNode, *BiThreadTree;
BiThreadNode *pre; // 当前访问节点的前驱
void visit(Elemtype x) {
cout << x << " ";
}
BiThreadTree createBiThreadTree() {
BiThreadNode *T;
char ch;
if ((ch = getchar()) == '#')
T = NULL;
else {
T = (BiThreadNode *)malloc(sizeof(BiThreadNode));
T->data = ch;
T->lchild = createBiThreadTree();
T->rchild = createBiThreadTree();
}
return T;
}
void InThreading(BiThreadTree T) {
if (T != NULL) {
InThreading(T->lchild);
if (T->lchild == NULL) {
T->LTag = 1;
T->lchild = pre;
}
else
T->LTag = 0;
if (pre->rchild == NULL) {
pre->RTag = 1;
pre->rchild = T;
}
else
pre->RTag = 0;
pre = T;
InThreading(T->rchild);
}
}
BiThreadNode *CreateInThrTree(BiThreadTree T) {
BiThreadNode *ThrHead;
ThrHead = (BiThreadNode *)malloc(sizeof(BiThreadNode));
ThrHead->RTag = 1;
ThrHead->rchild = ThrHead;
ThrHead->LTag = 0;
if (T == NULL)
ThrHead->lchild = ThrHead;
else {
ThrHead->lchild = T;
pre = ThrHead;
InThreading(T);
pre->rchild = ThrHead;
pre->RTag = 1;
ThrHead->rchild = pre;
}
return ThrHead;
}
void ThrInOrderTraverse(BiThreadTree ThrHead) {
BiThreadNode *temp = ThrHead->lchild;
while (temp != ThrHead) {
while (temp->LTag == 0)
temp = temp->lchild;
visit(temp->data);
while (temp->RTag == 1 && temp->rchild != ThrHead) {
temp = temp->rchild;
visit(temp->data);
}
temp = temp->rchild;
}
}
int main(void) {
BiThreadTree root;
root = createBiThreadTree();
BiThreadNode *ThrHead = CreateInThrTree(root);
ThrInOrderTraverse(ThrHead);
return 0;
}
数据结构中序线索二叉树C语言
最新推荐文章于 2025-01-18 00:17:35 发布
1046

被折叠的 条评论
为什么被折叠?



