《大话数据结构》上的,大家可以参考一下 

题目描述

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

下面给出按照中序遍历将二叉树中序线索化的算法:

在已经线索化的二叉线索树中,进行中序遍历的算法如下所示:

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

输入格式

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

输出格式

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

样例输入

<span style="color:#333333"><span style="color:#333333">ABC  DE G  F   </span></span>

样例输出

<span style="color:#333333"><span style="color:#333333">C B E G D F A </span></span>

#include<stdio.h>
#include<stdlib.h>
typedef enum{link,thread} pointerflag;
typedef struct BiTree{char c;struct BiTree *lchild,*rchild;pointerflag lflag;pointerflag rflag;
}*bitree,BITNODE;
bitree pre=NULL;//pre是全局变量,始终指向前驱结点
void creattree(bitree *);//建立二叉树
void thread_(bitree*,bitree);//线索化之前的准备
void threading(bitree);//线索化
void ThreadTraverse(bitree);//中序遍历
int main(){bitree head=NULL;//指向头结点 bitree t=NULL;//指向根节点 creattree(&t);//创建根节点 thread_(&head,t);//线索化 ThreadTraverse(head);//中序遍历
}
void creattree(bitree* t){char c;c=getchar();if(c==' '){(*t)=NULL;}else{(*t)=(bitree)malloc(sizeof(BITNODE));(*t)->c=c;creattree(&(*t)->lchild);creattree(&(*t)->rchild);}
}
void thread_(bitree* head,bitree t){(*head)=(bitree)malloc(sizeof(BITNODE));(*head)->lflag=link;(*head)->rflag=thread;(*head)->rchild=(*head);//右指针回指 if(!t)(*head)->lchild=*head;//左指针回指 else{(*head)->lchild=t;//有根结点 pre=(*head);threading(t);pre->rchild=*head;pre->rflag=thread;//最后一个结点线索化 (*head)->rchild=pre;}
}
void threading(bitree t){//线索化 if(t){threading(t->lchild);if(!(t->lchild)){t->lflag=thread;t->lchild=pre;}elset->lflag=link;if(!(pre->rchild)){pre->rflag=thread;pre->rchild=t;}elset->rflag=link;pre=t;threading(t->rchild);}
}
void ThreadTraverse(bitree head){bitree p=head->lchild;//根结点开始 while(p!=head){while(p->lflag==link){//因为是中序遍历,所以先找最左的结点 p=p->lchild;}printf("%c ",p->c);while(p->rflag==thread&&p->rchild!=head){p=p->rchild;printf("%c ",p->c);}p=p->rchild;//意味着有右孩子,那么,p将成为新的根结点 }
}

C语言 题目 1698: 数据结构-线索二叉树相关推荐

  1. (原)数据结构——线索二叉树

    原文地址:http://www.cnblogs.com/Security-Darren/p/4716082.html 转载务必注明出处! 线索二叉树的思想来源于二叉树的存储结构中,存在一些空的指针域, ...

  2. 数据结构——线索二叉树(TBT)

    文章目录 一.什么是线索二叉树(TBT)? 二.线索二叉树的建立 三.线索二叉树的实现 一.什么是线索二叉树(TBT)? 线索二叉树是一种优化的二叉树结构,对于以结构体指针实现二叉树的方案进行了顺序遍 ...

  3. C语言 题目 1689: 数据结构-求子串位置的定位函数

    题目描述 在算法4-1中已经描述过一种定位子串的算法,但其依赖字符串的其他操作(使用了算法4-3描述的子串提取以及字符串比较). 下面给出书中另一种相对独立的定位子串算法: 图:求子串位置的定位函数 ...

  4. C语言 题目 1688: 数据结构-字符串插入

    看下图的代码块理清思路 题目描述 将一个字符串插入到另一个字符串当中.算法描述如下: 图:字符串插入算法 输入格式 输入只有一行,两个字符串(stra,strb)和一个整数 i.字符串仅由英文大小写字 ...

  5. C语言 题目 1701: 数据结构-自顶向下的赫夫曼编码

    感觉还是自底向上简单,搜了搜答案貌似看懂了,自己手打了一遍,改写了某些看不懂的地方,又写了注释,希望对你有帮助(^∀^●)ノシ 题目描述 在本题中,我们将要讨论的是自顶向下的赫夫曼编码算法.从根出发, ...

  6. C语言 题目 1700: 数据结构-自底向上的赫夫曼编码

    查了好久信息,五花八门,这一题需要注意筛选出两个权值最小的结点后,将位序最小的放在左子树上,位序次小的放在右子树上. 题目描述 在通讯领域,经常需要将需要传送的文字转换成由二进制字符组成的字符串.在实 ...

  7. 数据结构—线索二叉树

    建议将思维导图保存下来观看,或点击这里在幕布上在线观看

  8. 【Java数据结构】线索二叉树

    中序线索二叉树 线索二叉树概述 线索二叉树代码实现 线索二叉树的数据结构 线索二叉树的遍历 线索二叉树示例完整代码 线索二叉树类 ThreadedBinaryTree 线索二叉树节点类 Threade ...

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

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

最新文章

  1. Git创建本地分支并关联远程分支
  2. 图片预览组件PhotoView
  3. 第四次团队作业——系统设计
  4. 通过实例理解javascript 的call()与apply()
  5. Python 列表的应用场景有哪些?你使用对了吗?
  6. mac php errorlog,Mac下使用php的error_log()函数发送邮件
  7. react 代码编写原则_如何编写易读的React代码— 10种编码风格技巧
  8. span 文本内容超过宽度自动换行
  9. 你真的会发朋友圈吗?
  10. 在OL6.5_64上安装Oracle11gR2_64
  11. c语言中fork,C语言fork函数学习
  12. Linux运维基础知识
  13. ExactScan pro for mac(万能扫描仪整合工具)
  14. iOS功能测试工具 Frank
  15. SOLIDWORKS启动时出现脚本错误问题
  16. meta http-equiv 属性 详解
  17. 海豚调度Dolphinscheduler源码分析(三)
  18. 信息系统项目管理师——信息化和信息系统
  19. 【Golang】获取本地IP
  20. (转)工作是一种本能?

热门文章

  1. 设计模式之装饰者模式及观察者模式
  2. Windows 编译 Lua版本 批处理
  3. torchserve使用教程(踩坑记录)
  4. 使用基数排序实现英文单词字母表顺序排序,时间复杂度 O(n)
  5. 翻译文档的工具哪个好用?推荐这四个翻译软件给你
  6. android加入摄像功能,Android Camera使用之录像功能
  7. 连续两周爬大蜀山能否减肥10斤测试记录
  8. Threadx 消息队列-发送消息_tx_queue_send
  9. matplotlib 绘图 显示中文
  10. 数据与广告系列十二:接上一篇,见习算法工程师教程