#include <cstdio>
#include <cstdlib>
typedef char ElemType;
typedef enum {Link, Thread} PointerTag; //Link = 0, Thread = 1;
typedef struct BiThrNode
{
char data;
struct BiThrNode *lchild, *rchild;
PointerTag ltag;
PointerTag rtag;
} BiThrNode,*BiThrTree;
BiThrTree pre; // 全局变量,始终指向刚刚访问过的结点(若指针p指向当前正在访问的节点,则pre为其前驱节点(即p刚访问完的节点) )
BiThrTree CreateBiThrTree(BiThrTree T)
{
char c;
scanf("%c", &c);
if('#' == c )
{
return NULL;
}
else
{
T = (BiThrNode *)malloc(sizeof(BiThrNode));
T->data = c;
T->ltag = Link;
T->rtag = Thread;
T->lchild = T->rchild = NULL;
printf("%c'lchild is:\n",T->data);
getchar();
T->lchild = CreateBiThrTree(T->lchild);
printf("%c'rchild is:\n",T->data) ;
getchar();
T->rchild = CreateBiThrTree(T->rchild);
}
return T;
}
// 中序遍历_线索化二叉树
void InThreading(BiThrTree T)
{
if(T)
{
InThreading( T->lchild ); // 递归左孩子线索化
if(!T->lchild ) // 如果该结点没有左孩子,设置ltag为Thread,并把lchild指向刚刚访问的结点。
{
T->ltag = Thread;
T->lchild = pre;
}
if(!pre->rchild )
{
pre->rtag = Thread;
pre->rchild = T;
}
pre = T;
InThreading( T->rchild ); // 递归右孩子线索化
}
}
/*中序线索化*/
void InOrderThreading(BiThrTree &p,BiThrTree T)
{
p = (BiThrTree)malloc(sizeof(BiThrNode));
/*头节点初始化*/
p->ltag = Link;
p->rtag = Thread;
p->rchild = p; //右指针回旋
if(!T)
{
p->lchild = p; //左指针回旋
}
else
{
p->lchild = T;
pre = p;
InThreading(T); //中序化
/* 处理最后一个节点*/
pre->rchild = p;
pre->rtag = Thread;
p->rchild = pre;
}
}
void visit(char c)
{
printf("%c ", c);
}
// 中序遍历二叉树
void InOrderTraverse(BiThrTree T )
{
BiThrTree p;
p = T->lchild; //访问根节点
while(p!= T)
{
while(p->ltag == Link )
{
p = p->lchild;
}
visit(p->data);
while(p->rtag == Thread && p->rchild != T )
{
p = p->rchild;
visit(p->data);
}
p = p->rchild;
}
}
int main()
{
BiThrTree P, T;
printf("Root’s is:\n");
T = CreateBiThrTree(T);
InOrderThreading(P,T);
printf("Inorder is-----\n");
InOrderTraverse(P);
printf("\n");
return 0;
}
线索化二叉树(中序)
最新推荐文章于 2022-05-21 09:30:33 发布