中序线索化二叉树
来源:互联网 发布:烟风煤粉管道设计软件 编辑:程序博客网 时间: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
- (原创)中序线索化二叉树
- 中序线索化二叉树
- 中序线索化 二叉树
- 中序线索化二叉树
- 实现中序线索化二叉树
- 中序线索化二叉树
- 中序线索化二叉树
- 中序线索化二叉树
- 中序线索化二叉树
- 中序线索化二叉树
- 中序线索化二叉树
- 中序线索化二叉树
- 二叉树的中序线索化
- 线索化二叉树(中序)
- 中序线索化二叉树
- 中序线索化二叉树
- 中序线索化二叉树以及中序遍历线索化二叉树、倒中序遍历线索化二叉树
- 中序线索二叉树
- dsp EDMA学习与疑问
- [ACM] sdut 2877 angry_birds_again_and_again (简单数学积分)
- java 数据转换
- 20141127-Capture与Capture CIS的区别
- android线程池的理解
- 中序线索化二叉树
- Java 基础总结
- iOS网络基础--发送同步、异步请求
- nyoj1110 一个简单数学题
- 解决信道系数为什么是复数问题
- hdu 1501 Zipper (记忆优化搜索)
- 闭包
- 常用图像算法(图像增强)
- >Hibernate 报错:this project is not a myeclipse hibernate project . assuming hibernate 3 cap