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 ...
随机推荐
- ODP方式,大批量数据写入ORACLE数据库
项目中在同步数据的时候,需要把获得的数据DataTable,写入oracle数据库 因为System.Data.OracleClient写入方式写入大批量数据特别慢,改用Oracle.DataAcce ...
- [archlinux][hardware] ThankPad T450自带SSD做bcache之后的使用寿命分析
这个分析的起因,是由于我之前干了这两个事: [troubleshoot][archlinux][bcache] 修改linux文件系统 / 分区方案 / 做混合硬盘 / 系统转生大!手!术!(调整底层 ...
- 过滤关键字防止XSS攻击
public static string ClearXSS(string str) { string returnValue = str; if (string.IsNullOrEmpty(retur ...
- vert.x学习(八),用JDBCClient配合c3p0操作数据库
今天学习了下vert.x的JDBCClient,我这里将今天的学习笔记记录下来.这次学习中使用了c3p0. 用使用JDBCClient和c3p0得现在pom.xml文件里面导入对应的依赖,下面贴出xm ...
- CMake undefined reference to `QTcpServer::QTcpServer(QObject*)'的解决
1. 这是因为工程link不到network的库,因此除了要包含头文件 #include 之外,还需要在.pro文件中加入: QT += network 2. 对于CMake,需添加Net ...
- mybatis---实现关联表查询
推荐学习博客: 1.http://www.cnblogs.com/xdp-gacl/p/4264440.html 2.http://www.cnblogs.com/yaobolove/p/544404 ...
- insert into linksvr or insert into from linksvr
通过链接服务器将实例A上的数据写入实例B,通常有以下两种方式--方案1:在实例A上执行insert into LinkForB.B..TableB select * from TableA--方案2: ...
- Spark&Hive:如何使用scala开发spark访问hive作业,如何使用yarn resourcemanager。
背景: 接到任务,需要在一个一天数据量在460亿条记录的hive表中,筛选出某些host为特定的值时才解析该条记录的http_content中的经纬度: 解析规则譬如: 需要解析host: api.m ...
- Leetcode: Poor Pigs
There are 1000 buckets, one and only one of them contains poison, the rest are filled with water. Th ...
- sprint 3 总结
1.要求: 演示可参考毕业设计答辩,包含两部分内容: 项目陈述,可综述项目.团队.开发过程等. 运行演示,实现的功能.业务.用户反馈等. 希望各组认真准备,拿出最好的阵容最好的状态,展示一学期的学习与 ...