当前位置: 首页 > news >正文

线索二叉树实例(前序创建,中序遍历)--2018.5.15

  1 #include <stdio.h>
  2 #include <stdlib.h>
  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     else
106     {
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

相关文章:

  • vuex填坑记录
  • 多版本并发控制
  • Unity4-用户输入
  • Java Web基础教程(二)开发基础
  • ActiveMq启动后,输入网址出现HTTP ERROR: 503错误的问题
  • 好代码是管出来的——浅谈.Net Core的代码管理方法与落地(更新中...)
  • win10应用程序添加到开机启动项的两种解决办法
  • SSL-ZYC 2432 面积最大
  • 剑指offer-用两个栈实现队列
  • 简单介绍帧动画
  • 浮动菜单
  • 2018.5.20
  • Xpath,XQuery,DTD
  • FLINK流计算拓扑任务代码分析二
  • 坑爹的阿里云
  • “大数据应用场景”之隔壁老王(连载四)
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Angular 2 DI - IoC DI - 1
  • export和import的用法总结
  • fetch 从初识到应用
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • jquery cookie
  • Ruby 2.x 源代码分析:扩展 概述
  • Sass Day-01
  • SwizzleMethod 黑魔法
  • web标准化(下)
  • 人脸识别最新开发经验demo
  • 数组大概知多少
  • const的用法,特别是用在函数前面与后面的区别
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #控制台大学课堂点名问题_课堂随机点名
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (11)MATLAB PCA+SVM 人脸识别
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (四)汇编语言——简单程序
  • (一)认识微服务
  • (已解决)什么是vue导航守卫
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .libPaths()设置包加载目录
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET Core中的去虚
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .Net的DataSet直接与SQL2005交互
  • .Net环境下的缓存技术介绍
  • ::before和::after 常见的用法
  • @AliasFor注解
  • @JsonFormat与@DateTimeFormat注解的使用
  • [1204 寻找子串位置] 解题报告
  • [2023-年度总结]凡是过往,皆为序章