#include <stdio.h>
#include <stdlib.h>
typedef char elemtype;
//線索儲存標誌位
//link(0)表示指向左右孩子的指針
//link(1)表示指向前驅後繼的線索
typedef enum {link,thread}pointertag;
typedef struct bithrnode{
char data;
struct bithrnode *lchild,*rchild;
pointertag ltag;
pointertag rtag;
}Bithrnode,*Bithrtree;
//全局變量,始終指向剛剛訪問過的節點
Bithrtree pre;
//創建一棵二叉樹,約定用戶遵照前序遍歷的方式輸入數據
void createbithrtree(Bithrtree *t){
char c;
scanf("%c",&c);
if(c==' '){
(*t)=NULL;
}
else {
(*t)=(Bithrnode *)malloc(sizeof(Bithrnode));
(*t)->data=c;
(*t)->ltag=link;
(*t)->rtag=link;
createbithrtree(&(*t)->lchild);
createbithrtree(&(*t)->rchild);
}
}
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=(Bithrnode *)malloc(sizeof(Bithrnode));
(*p)->ltag=link;
(*p)->rtag=thread;
(*p)->rchild=(*p);
if(!t){
(*p)->lchild=*p;
pre=*p;
inthreading(t);
pre->rchild=*p;
pre->rtag=thread;
(*p)->rchild=pre;
}
}
int main()
{
Bithrtree p,t=NULL;
createbithrtree(&t);
inorderthreading(&p,t);
return 0;
}
線索二叉樹的實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.