原文链接: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>

#include <malloc.h>
#define MaxSize 100
typedef struct node
{
    char data;
    int ltag,rtag;                          //增加的线索标记
    struct node *lchild;
    struct node *rchild;
} TBTNode;
/**
 *
 *
 *
 *
**/
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;
}

输入

输出

输出有两行,第一行为该二叉树的括号表示,接下来的一行输出二叉树线索中序序列。其中线索中序序列输出格式为 ”A B C D E“,请不要输出多余字符。

提示

使用C++编译并提交

AC代码:

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #define MaxSize 100
  4. typedef struct node
  5. {
  6. char data;
  7. int ltag,rtag; //增加的线索标记
  8. struct node *lchild;
  9. struct node *rchild;
  10. } TBTNode;
  11. void CreateTBTNode(TBTNode * &b,char *str) //建立的二叉树
  12. {
  13. TBTNode *St[MaxSize],*p=NULL;
  14. int top=-1,k,j=0;
  15. b=NULL; //建立的二叉树初始时为空
  16. char ch=str[j];
  17. while (ch!='\0') //str未扫描完时循环
  18. {
  19. switch(ch)
  20. {
  21. case '(':
  22. top++;
  23. St[top]=p;
  24. k=1;
  25. break; //为左结点
  26. case ')':
  27. top--;
  28. break;
  29. case ',':
  30. k=2;
  31. break; //为右结点
  32. default:
  33. p=(TBTNode *)malloc(sizeof(TBTNode));
  34. p->data=ch;
  35. p->lchild=p->rchild=NULL;
  36. if (b==NULL) //*p为二叉树的根结点
  37. b=p;
  38. else //已建立二叉树根结点
  39. {
  40. switch(k)
  41. {
  42. case 1:
  43. St[top]->lchild=p;
  44. break;
  45. case 2:
  46. St[top]->rchild=p;
  47. break;
  48. }
  49. }
  50. }
  51. j++;
  52. ch=str[j];
  53. }
  54. }
  55. void DispTBTNode(TBTNode *b) //输出二叉树
  56. {
  57. if (b!=NULL)
  58. {
  59. printf("%c",b->data);
  60. if (b->lchild!=NULL || b->rchild!=NULL)
  61. {
  62. printf("(");
  63. DispTBTNode(b->lchild);
  64. if (b->rchild!=NULL) printf(",");
  65. DispTBTNode(b->rchild);
  66. printf(")");
  67. }
  68. }
  69. }
  70. TBTNode *pre; //全局变量
  71. void Thread(TBTNode *&p) //中序遍历线索化二叉树
  72. {
  73. if (p!=NULL)
  74. {
  75. Thread(p->lchild); //左子树线索化
  76. if (p->lchild==NULL) //前驱线索
  77. {
  78. p->lchild=pre; //建立当前结点的前驱线索
  79. p->ltag=1;
  80. }
  81. else p->ltag=0;
  82. if (pre->rchild==NULL) //后继线索
  83. {
  84. pre->rchild=p; //建立前驱结点的后继线索
  85. pre->rtag=1;
  86. }
  87. else pre->rtag=0;
  88. pre=p;
  89. Thread(p->rchild); //右子树线索化
  90. }
  91. }
  92. TBTNode *CreaThread(TBTNode *b) //中序线索化二叉树
  93. {
  94. TBTNode *root=(TBTNode *)malloc(sizeof(TBTNode));//创建根结点
  95. root->ltag=0;
  96. root->rtag=1;
  97. root->rchild=b;
  98. if (b==NULL) //空二叉树
  99. root->lchild=root;
  100. else
  101. {
  102. root->lchild=b;
  103. pre=root; //pre是*p的前驱结点,供加线索用
  104. Thread(b); //中序遍历线索化二叉树
  105. pre->rchild=root; //最后处理,加入指向根结点的线索
  106. pre->rtag=1;
  107. root->rchild=pre; //根结点右线索化
  108. }
  109. return root;
  110. }
  111. void ThInOrder(TBTNode *tb) //输出二叉树的线索中序序列
  112. {
  113. TBTNode *p=tb->lchild; //指向根结点
  114. int flag=1;
  115. while (p!=tb)
  116. {
  117. while (p->ltag==0) p=p->lchild;
  118. printf(flag-->0?"%c":" %c",p->data);
  119. while (p->rtag==1 && p->rchild!=tb)
  120. {
  121. p=p->rchild;
  122. printf(" %c",p->data);
  123. }
  124. p=p->rchild;
  125. }
  126. printf("\n");
  127. }
  128. int main()
  129. {
  130. TBTNode *b,*T;
  131. CreateTBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");//建立的二叉树
  132. DispTBTNode(b); //输出二叉树
  133. printf("\n");
  134. T=CreaThread(b); //中序线索化二叉树
  135. ThInOrder(T); //输出二叉树的线索中序序列
  136. return 0;
  137. }

YTU 3026: 中序线索化二叉树的更多相关文章

  1. 后序线索化二叉树(Java版)

    前面介绍了前序线索化二叉树.中序线索化二叉树,本文将介绍后序线索化二叉树.之所以用单独的一篇文章来分析后序线索化二叉树,是因为后序线索化二叉树比前序.中序要复杂一些:另外在复习线索化二叉树的过程中,大 ...

  2. 图解中序遍历线索化二叉树,中序线索二叉树遍历,C\C++描述

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  3. 图解前序遍历线索化二叉树,前序线索二叉树遍历,C\C++描述

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  4. 数据结构与算法---线索化二叉树(Threaded BinaryTree)

    先看一个问题 将数列 {1, 3, 6, 8, 10, 14  } 构建成一颗二叉树 问题分析: 当我们对上面的二叉树进行中序遍历时,数列为 {8, 3, 10, 1, 6, 14 } 但是 6, 8 ...

  5. JAVA递归实现线索化二叉树

    JAVA递归实现线索化二叉树 基础理论 首先,二叉树递归遍历分为先序遍历.中序遍历和后序遍历. 先序遍历为:根节点+左子树+右子树 中序遍历为:左子树+根节点+右子树 后序遍历为:左子树+右子树+根节 ...

  6. 线索化二叉树的构建与先序,中序遍历(C++版)

    贴出学习C++数据结构线索化二叉树的过程, 方便和我一样的新手进行测试和学习 同时欢迎各位大神纠正. 不同与普通二叉树的地方会用背景色填充 //BinTreeNode_Thr.h enum Point ...

  7. C#数据结构-线索化二叉树

    为什么线索化二叉树? 对于二叉树的遍历,我们知道每个节点的前驱与后继,但是这是建立在遍历的基础上,否则我们只知道后续的左右子树.现在我们充分利用二叉树左右子树的空节点,分别指向当前节点的前驱.后继,便 ...

  8. YTU 2346: 中序遍历二叉树

    原文链接:https://www.dreamwings.cn/ytu2346/2606.html 2346: 中序遍历二叉树 时间限制: 1 Sec  内存限制: 128 MB 提交: 12  解决: ...

  9. 后序线索二叉树中查找结点*p的后继

    在后序线索二叉树中查找结点*p的后继: 1.若结点*p为根,则无后继:2.若结点*p为其双亲的右孩子,则其后继为其双亲:3.若结点*p为其双亲的左孩子,且双亲无右子女,则其后继为其双亲:4.若结点*p ...

随机推荐

  1. [bzoj1087][scoi2005]互不侵犯king

    题目大意 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上 左下右上右下八个方向上附近的各一个格子,共8个格子. 思路 首先,搜索可以放弃,因为这是一 ...

  2. [skill] strncpy里边有两个坑

    以前的笔记,今日翻出了复看了一下,转过来. ------------------------------------ 今天发现xxxdump中使用xxx_strncpy 替换 strncpy导致的bu ...

  3. macOS sierra 10.12 Cocoapods 私有库

    使用Cocoapods创建私有podspec 见文章:http://www.cocoachina.com/ios/20150228/11206.html 或http://blog.wtlucky.co ...

  4. 《Git教程-廖雪峰》学习笔记

    一.创建版本库 ①初始化一个Git仓库:git init ②添加文件到Git仓库:1.git add<file> ;  2.git commit 二.时光机穿梭 ①查看工作区状态,文件是否 ...

  5. OC ---- 字符串 数组 iOS学习-----细碎知识点总结

    NSString *urlString = [NSString stringWithFormat:@"http://www.apple.com"];        // 获取字符串 ...

  6. AJAX发送参数到后台,前台火狐debug报undefine

    后面经过查找:估计是数据并不是Json格式,由于var PATIENT_ID=getIdSelections();其中PATIENT_ID是数组,所以必须转成字符串. $('#table').on(' ...

  7. Android 强烈推荐:程序员接私活那点事

    今天周末在家宅着,并不是我不想运动,是因为北京的雨雪交加导致我想在家写文章,不过想想给大家写文章还是蛮惬意的,望一眼窗外,看一眼雪景,指尖在键盘上跳动,瞬间有种从屌丝程序员转变成了小姑娘们都羡慕的文艺 ...

  8. Spring操作指南-IoC基础环境配置(基于注解自动装配)

    项目源码:http://code.taobao.org/p/LearningJavaEE/src/LearningSpring001%20-%20Automatically%20wiring%20be ...

  9. 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 ...

  10. PIXHAWK DIY LED扩展板

    板载的状态LED灯,因为各种灰机的外壳有可能会被挡住看不到状态.那么我们也是可以用arduino板子来扩展实现外置,其实就是用328P芯片来实现. 这程序支持WS2812B的全彩LED灯. 默认的信号 ...