您的位置:首页 > 其它

线索化二叉树(中序)

2017-11-01 20:07 267 查看
 
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: