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 ...
随机推荐
- ES6 will change the way you write JS code.
https://hacks.mozilla.org/2015/04/es6-in-depth-an-introduction/ Counting to 6 The previous editions ...
- [dpdk] 熟悉SDK与初步使用 (四)(L3 Forwarding源码分析)
接续前节:[dpdk] 熟悉SDK与初步使用 (三)(IP Fragmentation源码分析) 前文中的最后一个问题,搁置,并没有找到答案.所以继续阅读其他例子的代码,想必定能在其他位置看到答案. ...
- Raspberry pi 添加vnc远程桌面控制
// 安装服务 apt-get install tightvncserver // 设置连接密码 vncpasswd // 在端口1处开启服务 tightvncserver :1
- 获取ip ,百度地图坐标点 和 在 后台调用 url()
protected void getip() { string ips = HttpContext.Current.Request.UserHostA ...
- Python学习【第十一篇】模块(1)
模块 模块让你能够有逻辑地组织你的Python代码段. 把相关的代码分配到一个模块里能让你的代码更好用,更易懂. 模块也是Python对象,具有随机的名字属性用来绑定或引用. 简单地说,模块就是一个保 ...
- 你知道吗?使用任何HTML5开发工具都可开发iOS、Android原生App
APICloud App开发平台一直在不断升级开发工具库,这一年增加了众多开发工具.目的就是让开发者可以选择使用任何自己喜欢的HTML5开发工具去开发App.这次,APICloud把所有关于开发工具的 ...
- (转载)(收藏)Awk学习详细文档
awk命令 本文索引 [隐藏] awk命令格式和选项 awk模式和操作 模式 操作 awk脚本基本结构 awk的工作原理 awk内置变量(预定义变量) 将外部变量值传递给awk awk运算与判断 算术 ...
- 设计模式学习笔记c++版——单例模式
特别注意单例模式c++实现在main.cpp中引用的时候要去申明下: Singleton * Singleton::m_Instance = NULL; //定义性声明 不然会报错:无法解析的外部符号 ...
- [Android Tips] 25. ADB Command Note
copy from https://github.com/operando/Android-Command-Note Android Command Note Logcat adb logcat -v ...
- sqlserver日志管理(转载)
sql 在使用中每次查询都会生成日志,但是如果你长久不去清理,可能整个硬都堆满哦,笔者就遇到这样的情况,直接网站后台都进不去了.下面我们一起来学习一下如何清理这个日志吧 SQL2005清空删除 ...