博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线索二叉树实例(前序创建,中序遍历)--2018.5.15
阅读量:5011 次
发布时间:2019-06-12

本文共 2898 字,大约阅读时间需要 9 分钟。

1 #include 
2 #include
3 4 typedef enum 5 { 6 Link, 7 Tread 8 }PointerTag; 9 10 typedef char TElemType; 11 12 typedef struct TreeNode 13 { 14 TElemType data; //数据单元 15 16 struct TreeNode *pLChild, *pRChild; //左右孩子指针 17 PointerTag LTag, RTag; //左右标志 ==0:孩子指针;==1:前后驱 18 }TreeNode, Tree; 19 20 TreeNode *gPre = NULL; 21 22 /* 先序创建二叉树 */ 23 void CreateTree(Tree **_t) 24 { 25 TElemType ch = -1; 26 27 scanf("%c", &ch); 28 29 if(ch == '#') 30 *_t = NULL; 31 else 32 { 33 *_t = (Tree*)malloc(sizeof(TreeNode)); 34 if(*_t == NULL) 35 return; 36 (*_t)->data = ch; 37 (*_t)->LTag = Link; 38 (*_t)->RTag = Link; 39 CreateTree(&((*_t)->pLChild)); 40 CreateTree(&((*_t)->pRChild)); 41 } 42 } 43 44 /* 遍历二叉树 */ 45 int InOrderThraverse_Thr(Tree *_t) 46 { 47 Tree *p =NULL; 48 49 p = _t->pLChild; 50 while(p != _t) 51 { 52 while(p->LTag == Link) 53 p = p->pLChild; 54 55 printf("%c ", p->data); //对节点的操作 56 57 while((p->RTag == Tread) && (p->pRChild != _t)) 58 { 59 p = p->pRChild; 60 61 printf("%c ", p->data); 62 } 63 p = p->pRChild; 64 } 65 66 return 0; 67 } 68 69 void InOrderThreading(Tree *_p) 70 { 71 if(_p) 72 { 73 InOrderThreading(_p->pLChild); //左树线索初始化 74 if(!_p->pLChild) //前驱线索 75 { 76 _p->LTag = Tread; 77 _p->pLChild = gPre; 78 } 79 if(!gPre->pRChild) //后继线索 80 { 81 gPre->RTag = Tread; 82 gPre->pRChild = _p; 83 } 84 gPre = _p; 85 86 InOrderThreading(_p->pRChild); //右子树线索初始化 87 } 88 } 89 90 /* 线索化二叉树 */ 91 int InOrderThread_Head(Tree **_h, Tree *_t) 92 { 93 (*_h) = (TreeNode *)malloc(sizeof(TreeNode)); 94 if(*_h == NULL) 95 return -1; 96 97 (*_h)->pRChild = *_h; 98 (*_h)->RTag = Link; 99 100 if(!_t)101 {102 (*_h)->pLChild = *_h;103 (*_h)->LTag = Link;104 }105 else106 {107 gPre = *_h;108 (*_h)->LTag = Link;109 (*_h)->pLChild = _t;110 InOrderThreading(_t);111 gPre->pRChild = *_h;112 gPre->RTag = Tread;113 (*_h)->pRChild = gPre;114 }115 116 return 0;117 }118 119 int main(void)120 {121 Tree *t=NULL, *temp=NULL;122 123 printf("请输入前序二叉树的内容:\n");124 CreateTree(&t);125 InOrderThread_Head(&temp, t); //加入头结点,并线索化 126 printf("输出中序二叉树的内容:\n"); 127 InOrderThraverse_Thr(temp); 128 129 printf("\n");130 return 0;131 }
mrrs@ubuntu:~/Desktop/DSC$ ./test请输入前序二叉树的内容:ABDG##H###CE#I##F##输出中序二叉树的内容:G D H B A E I C F

 

转载于:https://www.cnblogs.com/MrRS/p/9042942.html

你可能感兴趣的文章
实现简单的接口自动化测试平台
查看>>
EXCEL工作表合并
查看>>
Prime Path
查看>>
ODAC(V9.5.15) 学习笔记(三)TOraSession(2)
查看>>
单纯形法
查看>>
SQL中的replace函数
查看>>
java中的类型安全问题-Type safety: Unchecked cast from Object to ...
查看>>
如何解决最后一个尾注引用显示与致谢混为一谈的问题-下
查看>>
Java Socket编程 - 基于TCP方式的二进制文件传输【转】http://blog.csdn.net/jia20003/article/details/8248221...
查看>>
阅读之https及加密原理
查看>>
HDOJ4550 卡片游戏 随便销毁内存的代价就是wa//string类的一些用法
查看>>
css文本样式text、字体样式font
查看>>
python判断图片是否损坏
查看>>
MySQL服务启动:某些服务在未由其他服务或程序使用时将自动停止
查看>>
软件工程第四周作业 - 单元测试
查看>>
KNN与SVM对比&SVM与逻辑回归的对比
查看>>
php 现在拓展地址
查看>>
【Java并发编程】之十六:深入Java内存模型——happen-before规则及其对DCL的分析(含代码)...
查看>>
团队个人冲刺第三天
查看>>
unit
查看>>