线索二叉树
前序创建二叉树以及中序遍历创建线索二叉树
#include <iostream>
#include<string.h>
using namespace std;
// Link==0表示指向左右孩子指针, Thread==1表示指向前驱或后驱的线索
typedef enum {Link, Thread} PointerTag;
// 二叉线索存储结点
typedef struct BiThrNode
{
char data;
struct BiThrNode *lchild, *rchild;
PointerTag LTag; // 左标志
PointerTag RTag; // 右标志
}BiThrNode, *BiThrTree;
// 前序创建线索二叉树
void CreateBiThrTree(BiThrTree *T)
{
char ch;
cout << "data:";
cin >>ch;
if (ch == '#')
{
*T = NULL;
}
else
{
*T = new BiThrNode();
(*T)->data = ch;
CreateBiThrTree(&(*T)->lchild); // 构造左子树
CreateBiThrTree(&(*T)->rchild); // 构造右子树
}
}
// 中序遍历线索化的递归函数
BiThrTree pre; // 始终指向刚刚访问过的结点
void InThreading(BiThrTree p)
{
if (p)
{
InThreading(p->lchild); // 递归左子树线索化
if (!p->lchild) // 没有左孩子
{
p->LTag = Thread; // 前驱线索
p->lchild = pre; // 左孩子指针指向前驱
}
if (!pre->rchild) // 前驱没有右孩子
{
pre->RTag = Thread; // 后继线索
pre->rchild = p; // 前驱右孩子指针指向后继(当前结点p)
}
pre = p; // 保持pre指向p的前驱
InThreading(p->rchild); // 递归右子树线索化
}
}
// 中序遍历线索二叉树
void InOrderTraverse_Thr(BiThrTree T)
{
BiThrTree p;
p = T->lchild;
while (p != T)
{
while (p->LTag == Link)
p = p->lchild;
cout << p->data << endl;
while (p->RTag == Thread && p->rchild != T)
{
p = p->rchild;
cout << p->data << endl;
}
p = p->rchild;
}
}
int main() {
BiThrTree T = new BiThrNode(); //二叉树头结点
T->data = -1;
T->LTag = Link; // 头结点左标志为左孩子
T->RTag = Thread; // 头结点右标志为后继
CreateBiThrTree(&T->lchild);
pre = T;
InThreading(T->lchild);
pre->rchild = T; // 二叉树最后一个结点指向头结点
InOrderTraverse_Thr(T);
return 0;
}