Description

本题中,将会给出一个按照先序遍历得出的字符串,空格代表空的子节点,大写字母代表节点内容。请通过这个字符串建立二叉树,并按照题目描述中算法,中序遍历二叉树并中序线索化二叉树,之后中序遍历输出二叉线索树。

在遍历二叉树的过程中,是按照一定的规则将二叉树中的结点排列成一个线性序列,从而得到二叉树中结点的先序序列或中序序列或后序序列。但是,当以二叉链表作为存储结构时,只能找到结点的左右孩子信息,而不能直接得到结点在任意一个序列中的前驱和后继的信息,而这种信息只有在遍历的动态过程中才能够得到。为了保存这种信息,就需要使用线索链表。其中指向结点的前驱和后继的指针,叫做线索。添加上线索的二叉树称之为线索二叉树。

Input

输入只有一行,包含一个字符串S,用来建立二叉树。保证S为合法的二叉树先序遍历字符串,节点内容只有大写字母,且S的长度不超过100。

Output

共一行,包含一串字符,表示按中序遍历二叉线索树得出的节点内容,每个字母后输出一个空格。请注意行尾输出换行。

Sample Input

ABC  DE G  F   

Sample Output

C B E G D F A 

代码及注释:

#include<stdio.h>
#include<stdlib.h>
typedef struct {char ch;
}ElemType;
typedef enum {Link,Thread} PointerTag;
typedef struct BiTNode{ElemType elem;struct BiTNode *Lchild;struct BiTNode *Rchild;PointerTag LTag;PointerTag RTag;
}BiTNode,*BiTree;BiTree pre;
void CreatTree(BiTree *T);void InOrderThreading(BiTree *Thrt,BiTree T);
void InThreading(BiTree p);
void InOrderTraverse(BiTree T);
void Z_Traverse(BiTree T);
int main()
{BiTree T;CreatTree(&T);BiTree Thrt;InOrderThreading(&Thrt,T);//中序线索化 InOrderTraverse(Thrt);//中序遍历
}
void CreatTree(BiTree *T)//前序遍历建立二叉树
{char a;scanf("%c",&a);if(a==' '){*T=NULL;}else{*T=(BiTree)malloc(sizeof(BiTNode));(*T)->elem.ch=a;(*T)->LTag=Link;//初始化 (*T)->RTag=Link;//初始化 CreatTree( &( (*T)->Lchild ) );CreatTree( &( (*T)->Rchild ) );}
}
void InOrderThreading(BiTree *Thrt,BiTree T)
{(*Thrt) = (BiTree)malloc(sizeof(BiTNode));(*Thrt)->Rchild=*Thrt;//右指针回指(*Thrt)->RTag=Link;//初始化 if(!T)//如果树是空 左指针也回指 {(*Thrt)->Lchild=*Thrt;(*Thrt)->LTag=Link;} else{pre=*Thrt;(*Thrt)->Lchild=T;(*Thrt)->LTag=Link;InThreading(T);//线索化 pre->Rchild=*Thrt;pre->RTag=Thread;(*Thrt)->Rchild=pre;}
}
void InThreading(BiTree 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;InThreading(p->Rchild);}
}
void InOrderTraverse(BiTree T)//遍历线索化二叉树
{BiTree p;p=T->Lchild;while(p!=T){while(p->LTag==Link)//找到第一个左孩子为空的节点  {p=p->Lchild;}printf("%c ",p->elem.ch); while(p->RTag==Thread&&p->Rchild!=T)//线索不为空&&不是最后一个节点 {p=p->Rchild;//根据线索遍历 printf("%c ",p->elem.ch);}p=p->Rchild;//转到右子树  }
}

线索二叉树(C语言)相关推荐

  1. 线索二叉树 C语言 数据结构 先序线索二叉树 中序线索二叉树 后序线索二叉树

    在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序.中序.后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化. 文章目录 一.c语言实现先序线索.中序线 ...

  2. 线索二叉树(C语言详解----画图理解)

    揽 1. 前序 2.定义数据结构 3.线索二叉树的规律 3.1 图示 4.手算线索过程 5.问题以及改进 6.查找前驱和后继算法 7.代码 7.1建立二叉树 7.2 中序线索 7.4 前驱查找 7.5 ...

  3. 线索二叉树-C语言实现

    线索二叉树的定义 在二叉链表中, 具有 n 个结点的二叉链表有 n + 1 个空指针域. 由此, 可以利用这些空指针域来存放结点的直接前驱和直接后继的信息 结点的存储结构 lchild ltag da ...

  4. 线索二叉树 —C语言王道

    目录 线索二叉树概念 --普通二叉树缺点 --中序线索二叉树 --先序线索二叉树 --后序线索二叉树 -- 三种线索二叉树的比较 二叉树的线索化 普通方法代码 中序线索化代码 先序线索化代码 后序线索 ...

  5. 数据结构_线索二叉树(C语言)

    数据结构总目录 线索二叉树 1. 结构解析 线索二叉树,是对链式二叉树中的空指针的再次利用,在一般的链式二叉树中,叶子结点都存在左右空指针,所以为了不浪费这些空指针,于是就有了线索二叉树. 线索二叉树 ...

  6. C语言实现线索二叉树Threaded Binary Tree (附完整源码)

    C语言实现线索二叉树Threaded Binary Tree 树节点定义 实现以下7个接口 完整实现和main测试源码 树节点定义 typedef struct Node {int data; /** ...

  7. 线索二叉树详解(C语言版)

    文章目录 一.定义 二.结构 三.常用操作 结语 附录 一.定义 前面学习了二叉树,在操作过程中发现了几个问题: 问题一:二叉树如何才能实现从一个指定结点开始遍历呢?         问题二:在二叉树 ...

  8. c语言线索二叉树作用,C语言递归实现线索二叉树

    本文实例为大家分享了C语言递归实现线索二叉树的具体代码,供大家参考,具体内容如下 描述:将二叉树中结点的空左孩子指针域指向前驱结点,将空的右孩子指针域指向后继结点. code: #pragma war ...

  9. 怎样用C语言实现线索二叉树

    在实现线索二叉树时,需要在二叉树的结点中增加两个指针,分别指向前驱结点和后继结点. 下面是一个线索二叉树的结构体定义: typedef struct ThreadNode {char data;str ...

  10. C语言数据结构之线索二叉树

    C语言数据结构之线索二叉树 tips:前些天学习了二叉树的相关操作,今天来总结一下线索二叉树的操作. 线索二叉树:对二叉树以某种次序遍历得到序列中的前驱和后继,其中指向结点前驱和后继的指针称为线索,再 ...

最新文章

  1. 第一次简单总结CPU工作原理
  2. 32位oracle_oracle 性能调优
  3. 网络安全逐渐成为程序员的必备技能
  4. 什么是Ext(ExtJs)【转载】
  5. 论文阅读 | DasiamRPN
  6. 我想说:mysql 的 join 真的很弱|文末福利
  7. 【idea】idea快捷键(更新中....)
  8. python可以画动态图吗_matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
  9. 【iOS-Cocos2d游戏开发之二十一 】自定义精灵类并为你的精灵设置攻击帧以及动画创建!【二】...
  10. 做图软件matlab,Matlab 生物节律作图软件
  11. Bailian2884 Problem III【入门】
  12. java 重量单位换算_用java创建一个可以换算长度单位的length类,将某种长度单位进行数值间的转换。...
  13. 包分类算法最坏情况下性能比较
  14. 流氓软件卸载神器geek
  15. uniapp app中导出手机号码到通讯录
  16. 傅立叶级数到傅立叶变换推导与理解
  17. 红孩儿编辑器的核心控制子系统的函数依赖关系图
  18. 5G基础及计算机网络参考模型
  19. VOS为何会产生计费偏差,应该如何防范
  20. 在线绘图网站文图使用教程

热门文章

  1. 独角兽复活:Twilio上市预示IPO市场起死回生
  2. python 之selectors 实现文件上传下载
  3. 2016.8.7 UnicodeEncodeError 同时遍历多个list
  4. First Missing Positive missing number
  5. paip.微信菜单直接跳转url和获取openid流程总结
  6. PHP函数: set_time_limit
  7. AgileEAS.NET平台开发实例-药店系统-视频教程系列-索引
  8. jbpm5.1介绍(7)
  9. LVM逻辑卷磁盘管理
  10. 关于Android中设置闹钟的相对完善的解决方案