YTU 3026: 中序线索化二叉树
原文链接:https://www.dreamwings.cn/ytu3026/2896.html
3026: 中序线索化二叉树
时间限制: 1
Sec 内存限制: 128
MB
提交: 9 解决: 4
题目描述
已知一个二叉树的括号表示法如下:
A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))
部分代码已给出,请补充以实现相应的功能:
1、根据括号表示法建立二叉树
2、输出二叉树
3、中序线索化二叉树
4、输出二叉树线索中序序列
#include <stdio.h>
输入
输出
输出有两行,第一行为该二叉树的括号表示,接下来的一行输出二叉树线索中序序列。其中线索中序序列输出格式为 ”A B C D E“,请不要输出多余字符。
提示
使用C++编译并提交
AC代码:
- #include <stdio.h>
- #include <malloc.h>
- #define MaxSize 100
- typedef struct node
- {
- char data;
- int ltag,rtag; //增加的线索标记
- struct node *lchild;
- struct node *rchild;
- } TBTNode;
- void CreateTBTNode(TBTNode * &b,char *str) //建立的二叉树
- {
- TBTNode *St[MaxSize],*p=NULL;
- int top=-1,k,j=0;
- b=NULL; //建立的二叉树初始时为空
- char ch=str[j];
- while (ch!='\0') //str未扫描完时循环
- {
- switch(ch)
- {
- case '(':
- top++;
- St[top]=p;
- k=1;
- break; //为左结点
- case ')':
- top--;
- break;
- case ',':
- k=2;
- break; //为右结点
- default:
- p=(TBTNode *)malloc(sizeof(TBTNode));
- p->data=ch;
- p->lchild=p->rchild=NULL;
- if (b==NULL) //*p为二叉树的根结点
- b=p;
- else //已建立二叉树根结点
- {
- switch(k)
- {
- case 1:
- St[top]->lchild=p;
- break;
- case 2:
- St[top]->rchild=p;
- break;
- }
- }
- }
- j++;
- ch=str[j];
- }
- }
- void DispTBTNode(TBTNode *b) //输出二叉树
- {
- if (b!=NULL)
- {
- printf("%c",b->data);
- if (b->lchild!=NULL || b->rchild!=NULL)
- {
- printf("(");
- DispTBTNode(b->lchild);
- if (b->rchild!=NULL) printf(",");
- DispTBTNode(b->rchild);
- printf(")");
- }
- }
- }
- TBTNode *pre; //全局变量
- void Thread(TBTNode *&p) //中序遍历线索化二叉树
- {
- if (p!=NULL)
- {
- Thread(p->lchild); //左子树线索化
- if (p->lchild==NULL) //前驱线索
- {
- p->lchild=pre; //建立当前结点的前驱线索
- p->ltag=1;
- }
- else p->ltag=0;
- if (pre->rchild==NULL) //后继线索
- {
- pre->rchild=p; //建立前驱结点的后继线索
- pre->rtag=1;
- }
- else pre->rtag=0;
- pre=p;
- Thread(p->rchild); //右子树线索化
- }
- }
- TBTNode *CreaThread(TBTNode *b) //中序线索化二叉树
- {
- TBTNode *root=(TBTNode *)malloc(sizeof(TBTNode));//创建根结点
- root->ltag=0;
- root->rtag=1;
- root->rchild=b;
- if (b==NULL) //空二叉树
- root->lchild=root;
- else
- {
- root->lchild=b;
- pre=root; //pre是*p的前驱结点,供加线索用
- Thread(b); //中序遍历线索化二叉树
- pre->rchild=root; //最后处理,加入指向根结点的线索
- pre->rtag=1;
- root->rchild=pre; //根结点右线索化
- }
- return root;
- }
- void ThInOrder(TBTNode *tb) //输出二叉树的线索中序序列
- {
- TBTNode *p=tb->lchild; //指向根结点
- int flag=1;
- while (p!=tb)
- {
- while (p->ltag==0) p=p->lchild;
- printf(flag-->0?"%c":" %c",p->data);
- while (p->rtag==1 && p->rchild!=tb)
- {
- p=p->rchild;
- printf(" %c",p->data);
- }
- p=p->rchild;
- }
- printf("\n");
- }
- int main()
- {
- TBTNode *b,*T;
- CreateTBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");//建立的二叉树
- DispTBTNode(b); //输出二叉树
- printf("\n");
- T=CreaThread(b); //中序线索化二叉树
- ThInOrder(T); //输出二叉树的线索中序序列
- return 0;
- }
YTU 3026: 中序线索化二叉树的更多相关文章
- 后序线索化二叉树(Java版)
前面介绍了前序线索化二叉树.中序线索化二叉树,本文将介绍后序线索化二叉树.之所以用单独的一篇文章来分析后序线索化二叉树,是因为后序线索化二叉树比前序.中序要复杂一些:另外在复习线索化二叉树的过程中,大 ...
- 图解中序遍历线索化二叉树,中序线索二叉树遍历,C\C++描述
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 图解前序遍历线索化二叉树,前序线索二叉树遍历,C\C++描述
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 数据结构与算法---线索化二叉树(Threaded BinaryTree)
先看一个问题 将数列 {1, 3, 6, 8, 10, 14 } 构建成一颗二叉树 问题分析: 当我们对上面的二叉树进行中序遍历时,数列为 {8, 3, 10, 1, 6, 14 } 但是 6, 8 ...
- JAVA递归实现线索化二叉树
JAVA递归实现线索化二叉树 基础理论 首先,二叉树递归遍历分为先序遍历.中序遍历和后序遍历. 先序遍历为:根节点+左子树+右子树 中序遍历为:左子树+根节点+右子树 后序遍历为:左子树+右子树+根节 ...
- 线索化二叉树的构建与先序,中序遍历(C++版)
贴出学习C++数据结构线索化二叉树的过程, 方便和我一样的新手进行测试和学习 同时欢迎各位大神纠正. 不同与普通二叉树的地方会用背景色填充 //BinTreeNode_Thr.h enum Point ...
- C#数据结构-线索化二叉树
为什么线索化二叉树? 对于二叉树的遍历,我们知道每个节点的前驱与后继,但是这是建立在遍历的基础上,否则我们只知道后续的左右子树.现在我们充分利用二叉树左右子树的空节点,分别指向当前节点的前驱.后继,便 ...
- YTU 2346: 中序遍历二叉树
原文链接:https://www.dreamwings.cn/ytu2346/2606.html 2346: 中序遍历二叉树 时间限制: 1 Sec 内存限制: 128 MB 提交: 12 解决: ...
- 后序线索二叉树中查找结点*p的后继
在后序线索二叉树中查找结点*p的后继: 1.若结点*p为根,则无后继:2.若结点*p为其双亲的右孩子,则其后继为其双亲:3.若结点*p为其双亲的左孩子,且双亲无右子女,则其后继为其双亲:4.若结点*p ...
随机推荐
- [bzoj1087][scoi2005]互不侵犯king
题目大意 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上 左下右上右下八个方向上附近的各一个格子,共8个格子. 思路 首先,搜索可以放弃,因为这是一 ...
- [skill] strncpy里边有两个坑
以前的笔记,今日翻出了复看了一下,转过来. ------------------------------------ 今天发现xxxdump中使用xxx_strncpy 替换 strncpy导致的bu ...
- macOS sierra 10.12 Cocoapods 私有库
使用Cocoapods创建私有podspec 见文章:http://www.cocoachina.com/ios/20150228/11206.html 或http://blog.wtlucky.co ...
- 《Git教程-廖雪峰》学习笔记
一.创建版本库 ①初始化一个Git仓库:git init ②添加文件到Git仓库:1.git add<file> ; 2.git commit 二.时光机穿梭 ①查看工作区状态,文件是否 ...
- OC ---- 字符串 数组 iOS学习-----细碎知识点总结
NSString *urlString = [NSString stringWithFormat:@"http://www.apple.com"]; // 获取字符串 ...
- AJAX发送参数到后台,前台火狐debug报undefine
后面经过查找:估计是数据并不是Json格式,由于var PATIENT_ID=getIdSelections();其中PATIENT_ID是数组,所以必须转成字符串. $('#table').on(' ...
- Android 强烈推荐:程序员接私活那点事
今天周末在家宅着,并不是我不想运动,是因为北京的雨雪交加导致我想在家写文章,不过想想给大家写文章还是蛮惬意的,望一眼窗外,看一眼雪景,指尖在键盘上跳动,瞬间有种从屌丝程序员转变成了小姑娘们都羡慕的文艺 ...
- Spring操作指南-IoC基础环境配置(基于注解自动装配)
项目源码:http://code.taobao.org/p/LearningJavaEE/src/LearningSpring001%20-%20Automatically%20wiring%20be ...
- Hive:org.apache.hadoop.hdfs.protocol.NSQuotaExceededException: The NameSpace quota (directories and files) of directory /mydir is exceeded: quota=100000 file count=100001
集群中遇到了文件个数超出限制的错误: 0)昨天晚上spark 任务突然抛出了异常:org.apache.hadoop.hdfs.protocol.NSQuotaExceededException: T ...
- PIXHAWK DIY LED扩展板
板载的状态LED灯,因为各种灰机的外壳有可能会被挡住看不到状态.那么我们也是可以用arduino板子来扩展实现外置,其实就是用328P芯片来实现. 这程序支持WS2812B的全彩LED灯. 默认的信号 ...