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 ...
随机推荐
- 关于 Pragma 的使用总结
注意:此文乃是本人阅读多个博客文章后,记下的个人认为重点的地方. 参考文章: 参考1 参考2 #Pragma mark - 用于分离类中的不同功能的方法.(例如,一个 viewController ...
- 《Linux内核分析》第八周 进程的切换和系统的一般执行过程
[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK EIGHT ...
- iOS JavaScriptCore与H5交互时出现异常提示
在利用JavaScriptCore与H5交互时出现异常提示: This application is modifying the autolayout engine from a background ...
- vim 命令加解密文件
加密文件 vim file :X (大写X,是加密 ,小写x是保存) 输入密码: 确认密码: 解除密码: vim file :set key= :wq 命令模式下,输入 /word 后回车,即查找w ...
- vim - save current file with a new name but keep editing current file
http://superuser.com/questions/414110/vim-save-a-file-as-a-different-filename-but-keep-w-as-the-curr ...
- Trace-如何跟踪某个Job的开销
1.背景 下面是从以往Profiler收集的跟踪文件中提取Job有关数据 ;with cte as( Duration_ms ,CPU CPU_ms,Reads,Writes,StartTime,En ...
- 可爱的Python_课后习题_CDay−5 Python 初体验和原始需求
计算今年是否是闰年.判断闰年条件,满足年份模400 为0,或者模4 为0 但模100不为0. def is_learp_year(year): """判断年份是否为润年& ...
- pip install 安装python-requests
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple python-requests
- Nexus安装及部署(含如何在Tomcat中部署)
1. Nexus价值 1)方便-节约带宽-快 2)便于统一管理 3)持续集成需要 2.Nexus下载 http://www.sonatype.org/nexus/go 3.Nexus启动 解压后进入\ ...
- Python--循环语句
Python 循环语句 循环语句允许我们执行一个语句或语句组多次,下面是在大多数编程语言中的循环语句的一般形式: Python提供了for循环和while循环(在Python中没有do..while循 ...