typedef struct ThreadNode{
int data;
struct ThreadNode *lchild,*rchild;
int ltag,rtag;
}ThreadNode,*ThreadTree;
ThreadNode *pre=NULL;
//初始化一棵树
void initTree(ThreadTree &T){
T = (ThreadNode *)malloc(sizeof(ThreadNode));
ThreadNode *n2 =(ThreadNode *)malloc(sizeof(ThreadNode));
ThreadNode *n3 =(ThreadNode *)malloc(sizeof(ThreadNode));
ThreadNode *n4 =(ThreadNode *)malloc(sizeof(ThreadNode));
ThreadNode *n5 =(ThreadNode *)malloc(sizeof(ThreadNode));
T->data=1;
T->ltag=T->rtag=0;
n2->data=2;
n2->ltag=n2->rtag=0;
n2->rchild=NULL;
T->lchild=n2;
n3->data=3;
n3->ltag=n3->rtag=0;
n3->lchild=NULL;
T->rchild=n3;
n4->data=4;
n4->ltag=n4->rtag=0;
n4->lchild=n4->rchild=NULL;
n2->lchild=n4;
n5->data=5;
n5->ltag=n5->rtag=0;
n5->lchild=n5->rchild=NULL;
n3->rchild=n5;
}
void visit(ThreadNode *q){
if (q->lchild==NULL) {
q->lchild=pre;
q->ltag=1;
}
if (pre!=NULL&&pre->rchild==NULL) {
pre->rchild=q;
pre->rtag=1;
}
pre=q;
}
void PreThread(ThreadTree T){
if (T!=NULL) {
visit(T);
if (T->ltag==0) {
PreThread(T->lchild);
}
if(T->rtag==0){
PreThread(T->rchild);
}
}
}
//先序线索化二叉树T
void CreatePreThread(ThreadTree T){
if (T!=NULL) {
PreThread(T);
pre->rchild=NULL;
pre->rtag=1;
}
}
ThreadNode *NextNode(ThreadNode *p){
if (p->lchild!=NULL&&p->ltag==0) {
return p->lchild;
}
return p->rchild;
}
void printing(ThreadNode *q){
printf("%d",q->data);
}
//先序遍历(写法一)
void PreOrder(ThreadNode *T){
if (T!=NULL) {
for (ThreadNode *p=T; p!=NULL; p=NextNode(p)) {
printing(p);
}
}
}
//先序遍历(写法二)
void PreOrder2(ThreadNode *T){
ThreadNode *p =T;
while (p!=NULL) {
while (p->ltag==0) {
printing(p);
p=p->lchild;
}
printing(p);
p=p->rchild;
}
}
线索二叉树之「先序」线索二叉树
最新推荐文章于 2023-05-22 16:25:58 发布