#include <iostream>
using namespace std;
#define Status int
#define OK 1
#define ERROR 0
#define TElemType char
typedef enum{
Link,Thread
}PointerTag;
typedef struct BiThrNode{
TElemType data;
struct BiThrNode *lchild, *rchild;
PointerTag LTag , RTag;
}BiThrNode, *BiThrTree;
char Vexch[26]={'A','B','D','H','$','$','I','$','$','E','J','$','$','$','C','F','$','$','G','$','$'};
int i=0;
Status CreatBiThrTree(BiThrTree &T) {
if(Vexch[i++]=='$') T=NULL;
else {
T= (BiThrTree)malloc(sizeof(BiThrNode));
if(!T) return 0;
T->data=Vexch[i-1];
T->LTag=Link;
CreatBiThrTree(T->lchild);
T->RTag=Link;
CreatBiThrTree(T->rchild);
}
return 1;
}
Status visit(TElemType e) {
cout << e << " ";
return OK;
}
BiThrTree pre;
void PreThreading(BiThrTree p) {
if(p) {
if(!p->lchild) {
p->LTag = Thread;
p->lchild = pre;
}
if(!pre->rchild) {
pre->RTag = Thread;
pre->rchild = p ;
}
pre = p;
if(p->LTag == Link)
PreThreading(p->lchild);
if(p->RTag == Link)
PreThreading(p->rchild);
}
}
Status PreOrderThreading(BiThrTree &Thrt,BiThrTree T) {
if(!(Thrt = (BiThrTree)malloc(sizeof(BiThrNode))))
return ERROR;
Thrt->RTag = Thread;
Thrt->rchild = Thrt ;
Thrt->LTag = Link;
if(!T) {
Thrt->lchild = Thrt;
}
else {
Thrt->lchild = T;
pre = Thrt ;
PreThreading(T);
pre->rchild = Thrt ;
pre->RTag = Thread;
Thrt->rchild = pre;
}
return OK;
}
Status PreOrderTraverse_Thr(BiThrTree T) {
BiThrTree p ;
p = T->lchild;
while(p != T) {
visit(p->data);
if(p->LTag == Link)
p = p->lchild;
else
p = p->rchild;
}
return OK;
}
int main() {
BiThrTree T, PreT;
CreatBiThrTree(T);
PreOrderThreading(PreT , T);
PreOrderTraverse_Thr(PreT);
cout << endl;
return 0;
}
数据结构先序线索二叉树C语言
最新推荐文章于 2023-11-23 15:11:07 发布
2万+

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



