线索二叉树算法 .pdf

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
线索二叉树算法 #include #include #include typedef char DataType;/*定义 DataType 类型*/ typedef enum {Link,Thread}PointerTag; typedef struct node{ DataType data; struct node *lchild, *rchild;/*左右孩子子树*/ PointerTag LTag,RTag; }BiThrNode; /*结点类型*/ typedef BiThrNode *BiThrTree ;/*二叉树类型*/ void CreatBinTree(BiThrTree *T) { /*构造二叉链表,注意:输入序列是先序序列*/ char ch; if ((ch=getchar())==' ') *T=NULL; else{ /*读入非空格*/ *T=(BiThrNode *)malloc(sizeof(BiThrNode));/*生成结点*/ (*T)->data=ch;(*T)->LTag=Link;(*T)->RTag=Link; CreatBinTree(&(*T)->lchild); /*构造左子树 */ CreatBinTree(&(*T)->rchild); /*构造右子树*/ } } BiThrTree pre;/*全局变量*/ void InThreading(BiThrTree p) { if(p) {InThreading(p->lchild);/*左子树线索化*/ if(!p->lchild){p->LTag=Thread;p->lchild=pre;}/*前驱线索*/ if(!pre->rchild){pre->RTag=Thread;pre->rchild=p;}/*后继线索*/ pre=p;/*保持 pre 指向 p*/ InThreading(p->rchild);/*右子树线索化*/ } } int InOrderThreading(BiThrTree *Thrt,BiThrTree T) /*中序遍厉二叉树T,并将其中序线索化,Thrt 指向头结点*/ { if(!(*Thrt=(BiThrTree)malloc(sizeof(BiThrNode)))) exit(0); (*Thrt)->LTag=Link;(*Thrt)->RTag=Thread;/*建头结点*/ (*Thrt)->rchild=*Thrt;/*右指针回指*/ if(!T) (*Thrt)->lchild=*Thrt; else { (*Thrt)->lchild=T;pre=*Thrt; InThreading(T);/*中序遍历进行中序线索化*/ pre->rchild=*Thrt;pre->RTag=Thread;/*最后一个结点线索化*/ (*Thrt)->rchild=pre; } return 1; } int print(BiThrTree e) {printf("%d %c %d\n",e->LTag,e->data,e->RTag);return 1;} int InOrderTraverse(BiThrTree T,int (* visit)(BiThrTree e)) /*T 指向头结点,头结点的左链 lchild 指向根结点,中序遍厉二叉树*/ {BiThrTree p; p=T->lchild;/*p 指向根结点*/ while(p!=T)/*空树或遍厉结束时,p==T*/ {while(p->LTag==Link) p=p->lchild; if(!visit(p)) return 0;/*打印*/ while(p->RTag==Thread&&p->rchild!=T) {p=p->rchild;visit(p);}/*访问后继结点*/ p=p->rchild; } return 1; } void main() { /*测试程序*/ BiThrTree T,Thrt; CreatBinTree(&T); InOrderThreading(&Thrt,T); InOrderTraverse(Thrt,print); } /*可输入"-+a *b -c d /e f "来测试(注意空格)*/

文档评论(0)

张老师 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

认证主体张**

1亿VIP精品文档

相关文档

相关课程推荐