#include <iostream>
using namespace std;
// 线索二叉树节点结构
typedef struct CludeBiNode {
int data;
int ltag, rtag;
struct CludeBiNode *left, *right;
} CludeBiNode, *CludeBiTree;
// 初始化线索二叉树
void InitCludeBiTree(CludeBiTree &T) {
T = NULL;
}
// 插入节点
void InsertCludeBiNode(CludeBiTree &T, int val) {
if (T == NULL) {
T = new CludeBiNode;
T->data = val;
T->ltag = 0;
T->rtag = 0;
T->left = NULL;
T->right = NULL;
} else if (val < T->data) {
InsertCludeBiNode(T->left, val);
} else if (val > T->data) {
InsertCludeBiNode(T->right, val);
} else {
cout << "值已存在,插入失败" << endl;
}
}
// 中序遍历线索化
void InThread(CludeBiTree &p, CludeBiTree &pre) {
if (p != NULL) {
InThread(p->left, pre); // 递归左子树线索化
if (p->left == NULL) {
p->left = pre;
p->ltag = 1;
}
if (pre != NULL && pre->right == NULL) {
pre->right = p;
pre->rtag = 1;
}
pre = p; // 保持pre指向p的前驱
InThread(p->right, pre); // 递归右子树线索化
}
}
// 创建中序线索二叉树
void CreateInThread(CludeBiTree T) {
CludeBiTree pre = NULL;
if (T != NULL) {
InThread(T, pre);
pre->right = NULL; // 处理最后一个节点
pre->rtag = 1;
}
}
// 中序遍历线索二叉树
void InOrderTraverse(CludeBiTree T) {
CludeBiTree p = T;
while (p != NULL) {
while (p->ltag == 0) {
p = p->left;
}
cout << p->data << " ";
while (p->rtag == 1 && p->right != NULL) {
p = p->right;
cout << p->data << " ";
}
p = p->right;
}
}
int main() {
CludeBiTree T;
InitCludeBiTree(T);
// 插入一些节点
InsertCludeBiNode(T, 60);
InsertCludeBiNode(T, 55);
InsertCludeBiNode(T, 45);
InsertCludeBiNode(T, 65);
InsertCludeBiNode(T, 80);
InsertCludeBiNode(T, 89);
// 创建中序线索二叉树
CreateInThread(T);
// 中序遍历线索二叉树
cout << "中序遍历线索二叉树: ";
InOrderTraverse(T);
cout << endl;
return 0;
}