您的位置:首页 > 其它

线索二叉树的实现

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