中序线索化二叉树

来源:互联网 发布:烟风煤粉管道设计软件 编辑:程序博客网 时间:2024/06/14 10:56
#include<stdio.h>#include<stdlib.h>#define OK 1#define ERROR 0#define OVERFLOW 0typedef enum PointerTag{Link,Thread};// Link == 0:指针,Thread=1:线索typedef char TElemType;//数据类型typedef int Status;typedef struct BiThrNode{TElemType data;BiThrNode *lchild,*rchild;PointerTag LTag,RTag;//左右标点}BiThrNode,*BiThrTree;//创建一个全局变量BiThrTree pre=NULL;//二叉树的创建void CreateBiTree(BiThrTree &btt){char c;c=getchar();if(c=='#')btt=NULL;else{btt=(BiThrTree)malloc(sizeof(BiThrNode));btt->data=c;btt->LTag=Link;btt->RTag=Link;//为左右标签设置初始值CreateBiTree(btt->lchild);CreateBiTree(btt->rchild);}}Status Visit(TElemType e){if(e=='\0')return ERROR;else{printf("%c",e);return OK;}}void PreOrderTraverse(BiThrTree btt)//递归前序遍历{if(btt){printf("%c",btt->data);PreOrderTraverse(btt->lchild);PreOrderTraverse(btt->rchild);}}void InOrderTraverse(BiThrTree btt)//递归中序遍历{if(btt){InOrderTraverse(btt->lchild);printf("%c",btt->data);InOrderTraverse(btt->rchild);}}void PostOrderTraverse(BiThrTree btt)//递归后续遍历{if(btt){PostOrderTraverse(btt->lchild);PostOrderTraverse(btt->rchild);printf("%c",btt->data);}}void InThreading(BiThrTree p){if(p){InThreading(p->lchild);//线索化左树if(!p->lchild)//前去线索{p->lchild=pre;p->LTag=Thread;}if(!pre->rchild)//后继结点{pre->rchild=p;pre->RTag=Thread;}pre=p;//保存前驱节点//注意在线索化最后一个结点时,p=pre,此时p->rchild是为空的,所以递归结束,最后一个结点没有成功被线索化InThreading(p->rchild);//线索化右树}}Status InOrderThreading(BiThrTree &Thrt,BiThrTree T)//中序线索化二叉树{Thrt=(BiThrTree)malloc(sizeof(BiThrNode));//创建头结点if(!Thrt)return ERROR;Thrt->RTag=Thread;Thrt->rchild=Thrt;Thrt->LTag=Link;if(!T)Thrt->lchild=Thrt;//左结点为空便指向自己else{Thrt->lchild=T;Thrt->LTag=Link;pre=Thrt;//保存上一节点InThreading(Thrt->lchild);pre->rchild=Thrt;//最后一个结点线索化Thrt->RTag=Thread;Thrt->rchild=pre;}return OK;}Status InOrderTraverse_Thr(BiThrTree T,Status(Visit)(TElemType e)){BiThrTree p=T->lchild;while(p!=T)//当二叉树为空或者便利完成时,p=T{//由于中序遍历,首节点的左孩子是空的while(p->LTag==Link)//找到左孩子p=p->lchild;if(!Visit(p->data))return ERROR;while(p->RTag==Thread&&p!=T)//右孩子为空{p=p->rchild;//访问后继结点Visit(p->data);}p=p->rchild;}return OK;}//InOrderTraverse_Thrint main(){BiThrTree Thrt,T;CreateBiTree(T);InOrderThreading(Thrt,T);InOrderTraverse_Thr(Thrt,Visit);printf("\n");return 0;}

                                             
0 0
原创粉丝点击