嗯,没错我还报了蓝桥杯。

这是题目

问题描述

二叉树可以用于排序。其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树。

当遇到空子树时,则把该节点放入那个位置。

比如,10 8 5 7 12 4 的输入顺序,应该建成二叉树如下图所示,其中.表示空白。

...|-12

10-|

...|-8-|

.......|...|-7

.......|-5-|

...........|-4

本题目要求:根据已知的数字,建立排序二叉树,并在标准输出中横向打印该二叉树。

输入格式

输入数据为一行空格分开的N个整数。 N<100,每个数字不超过10000。

输入数据中没有重复的数字。

输出格式

输出该排序二叉树的横向表示。为了便于评卷程序比对空格的数目,请把空格用句点代替:

样例输入1

10 5 20

样例输出1

...|-20

10-|

...|-5

样例输入2

5 10 20 8 4 7

样例输出2

.......|-20

..|-10-|

..|....|-8-|

..|........|-7

5-|

..|-4

这是分析

  • 横向打印,使用中序遍历可以获得每个节点应该在的层数
  • ‘|’这个符号的打印是大难点

这是我的思路

  • 使用一个二维字符数组来保存所有应该打印出来的东西
  • 使用中序遍历获得顺序
  • 同样使用中序遍历来打印每个数字
  • 对于每一个非叶节点,单独打印这个节点跟它的子节点的连线

这是代码

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define COLS 10002
  4. #define ROWS 102
  5. char graph[ROWS][COLS];
  6. struct Node
  7. {
  8. int lines;//这个节点应该在第几行被打印
  9. int layer;//这个节点在第几层
  10. int value;
  11. struct Node *left,*right;
  12. };
  13. struct Node *tree;
  14. int i_index = 0;
  15. int j_index = 0;
  16. int index=0;
  17. void insert(int value)
  18. {
  19. int layer = 1;
  20. int flag = 0;
  21. struct Node *temp,*p;
  22. if(tree==NULL){
  23. //putchar('a');
  24. tree = (struct Node*)malloc(sizeof(struct Node));
  25. tree->layer = layer;
  26. tree->value = value;
  27. tree->right = NULL;
  28. tree->left = NULL;
  29. }else{
  30. //putchar('b');
  31. temp = tree;
  32. while(temp!=NULL){
  33. if(value>temp->value){
  34. if(temp->right!=NULL)
  35. temp = temp->right;
  36. else{
  37. layer++;
  38. flag = 1;
  39. break;
  40. }
  41. }else{
  42. if(temp->left!=NULL)
  43. temp = temp->left;
  44. else{
  45. layer++;
  46. flag = 2;
  47. break;
  48. }
  49. }
  50. layer++;
  51. }
  52. p = (struct Node*)malloc(sizeof(struct Node));
  53. p->left = NULL;
  54. p->right = NULL;
  55. p->layer = layer;
  56. p->value = value;
  57. if(flag==1)
  58. temp->right = p;
  59. else
  60. temp->left = p;
  61. //putchar('d');
  62. }
  63. //putchar('c');
  64. }
  65. int getLen(int n)
  66. {
  67. int result = 0;
  68. while(n>0)
  69. {
  70. n/=10;
  71. result++;
  72. }
  73. return result;
  74. }
  75. void inOrder(struct Node *p)
  76. {
  77. if(p==NULL)
  78. return;
  79. inOrder(p->right);
  80. p->lines = index++;
  81. // printf("%d:%d:%d\n",p->value,p->lines,p->layer);
  82. inOrder(p->left);
  83. }
  84. void DrawFinal(struct Node *p,int j)
  85. {
  86. int up;int down;
  87. int i;
  88. if(p->right==NULL&&p->left==NULL)
  89. return;
  90. if(p->right==NULL)
  91. up=p->lines;
  92. else
  93. up=p->right->lines;
  94. if(p->left==NULL)
  95. down = p->lines;
  96. else
  97. down=p->left->lines;
  98. for(i = up;i<=down;i++)
  99. graph[i][j] = '|';
  100. }
  101. void inOrderDraw(struct Node *p)
  102. {
  103. int i;
  104. int temp = j_index;
  105. if(p==NULL)
  106. return ;
  107. if(p->right!=NULL)
  108. {
  109. if(p->layer>1)
  110. j_index+=3;
  111. j_index+=getLen(p->value);
  112. inOrderDraw(p->right);
  113. }
  114. j_index = temp;
  115. /*for(i=0;i<j_index;i++)
  116. graph[i_index][i] = '.';
  117. */
  118. i = j_index;
  119. if(p->layer!=1)
  120. {
  121. graph[i_index][i++] = '.';
  122. graph[i_index][i++] = '|';
  123. graph[i_index][i++] = '-';
  124. }
  125. i+= sprintf(graph[i_index]+i,"%d",p->value);
  126. if(p->left!=NULL||p->right!=NULL)
  127. {
  128. graph[i_index][i++] = '-';
  129. graph[i_index][i++] = '|';
  130. DrawFinal(p,i-1);
  131. }
  132. graph[i_index][i++] = '\n';
  133. graph[i_index][i] = '\0';
  134. i_index++;
  135. if(p->left!=NULL)
  136. {
  137. if(p->layer>1)
  138. j_index+=3;
  139. j_index+=getLen(p->value);
  140. inOrderDraw(p->left);
  141. }
  142. }
  143. int main()
  144. {
  145. int i,j;
  146. int num;
  147. char c;
  148. int n=0;
  149. for(i = 0;i<ROWS;i++)
  150. for(j=0;j<COLS;j++)
  151. graph[i][j] = '.';
  152. tree = NULL;
  153. while(1)
  154. {
  155. scanf("%d",&num);
  156. c = getchar();
  157. n++;
  158. insert(num);
  159. if(c=='\n')
  160. break;
  161. }
  162. inOrder(tree);
  163. inOrderDraw(tree);
  164. for(i=0;i<n;i++)
  165. for(j=0;graph[i][j]!='\0';j++)
  166. putchar(graph[i][j]);
  167. return 0;
  168. }

感觉代码还是没有其他人的好。

但是其他人的我也没看懂。。。(:3 | ∠)

但是做出来了还是很开心的。。

蓝桥杯PREV-11:横向打印二叉树的更多相关文章

  1. Java实现 蓝桥杯 历届试题 横向打印二叉树

    问题描述 二叉树可以用于排序.其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树. 当遇到空子树时,则把该节点放入那个位置. 比如,10 8 5 7 ...

  2. 算法笔记_189:历届试题 横向打印二叉树(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 二叉树可以用于排序.其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树. 当遇到空子树 ...

  3. 【蓝桥杯单片机11】单总线温度传感器DS18B20的基本操作

    [蓝桥杯单片机11]单总线温度传感器DS18B20的基本操作 广东职业技术学院 欧浩源 单总线数字温度传感器DS18B20几乎成了各类单片机甚至ARM实验板的标配模块来,在蓝桥杯的往届省赛和国赛中,这 ...

  4. 蓝桥杯 历届试题 PREV-2 打印十字图

    历届试题 打印十字图   时间限制:1.0s   内存限制:256.0MB 小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示: 对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并 ...

  5. Java实现 蓝桥杯VIP 算法训练 打印下述图形

    算法训练 4-1打印下述图形 时间限制:1.0s 内存限制:256.0MB 问题描述 使用循环结构打印下述图形,打印行数n由用户输入.打印空格时使用"%s"格式,向printf函数 ...

  6. 2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案

    2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案 不知不觉离决赛都过去一个月了,一直忙于各种事情,都忘记整理一份试题.当作回忆也好. 1. 标题:好好学习 汤姆跟爷爷来中国旅游.一天,他帮助 ...

  7. 算法笔记_204:第四届蓝桥杯软件类决赛真题(Java语言C组)

    目录 1 好好学习 2 埃及分数 3 金蝉素数 4 横向打印二叉树 5 危险系数 6 公式求值   前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 好好学习 汤姆跟爷爷来中国旅游.一天,他帮助中国的 ...

  8. 第四届蓝桥杯JavaC组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.好好学习 汤姆跟爷爷来中国旅游.一天,他帮助中国的小朋友贴标语.他负责贴的标语是分别写在四块红纸上的四个大字:"好.好.学. ...

  9. 第九届蓝桥杯国赛+第二天的第11届acm省赛的总结

    第九届蓝桥杯国赛+第二天的第11届acm省赛的总结 25号坐的去北京的火车,10个小时的火车,然后挤了快两个小时的地铁,最终达到了中国矿业大学旁边的订的房间.12个小时很难受,晕车症状有点严重,吃了快 ...

随机推荐

  1. UiAutomator2.0升级填坑记

    UiAutomator2.0升级填坑记 SkySeraph May. 28th 2017 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点:www.sk ...

  2. 使用Spring Boot快速构建基于SQLite数据源的应用

    为了提供一个单包易部署的服务器应用,考虑使用Spring Boot,因为其集成了Apache Tomcat,易于运行,免去绝大部分了服务器配置的步骤. 项目初始化 首先从mvn archetype:g ...

  3. mac监听Dock激活程序

    mac监听Dock激活程序 涉及库添加: LIBS += -framework CoreFoundation -framework Carbon -lobjc 涉及头文件: #include < ...

  4. c++中类对象的内存对齐

    很多C++书籍中都介绍过,一个Class对象需要占用多大的内存空间.最权威的结论是: *非静态成员变量总合.(not static) *加上编译器为了CPU计算,作出的数据对齐处理.(c语言中面试中经 ...

  5. Android开发中EditText的点击Enter键焦点改变处理(获取焦点和失去焦点交互变化)

    最近因为项目需要,需要将EditText的焦点转移到LineraLayout上: 即为EditText输入完毕后,点击回车键或者按压其他嵌入式android设备的OK键,获取LineraLayout的 ...

  6. selenium的操作JS命令的接口JavascriptExecutor的介绍

    nterface JavascriptExecutor 接口 JS执行器 public interface JavascriptExecutor 表示可以执行JavaScript的驱动程序,提供对机制 ...

  7. kali linux 2.0下搭建DVWA渗透测试演练平台

    DVWA (Dam Vulnerable Web Application)DVWA是用PHP+MySQL编写的一套用于常规WEB漏洞教学和检测的WEB脆弱性测试程序.包含了SQL注入.XSS.盲注等常 ...

  8. AngularJS 动画总结

    对读过的几篇文章的总结,尽量保证逻辑性,不断补充.精简.更正. 后面会列出参考文章地址,方便以后取用.感谢各位作者以及翻译者. AngularJS 动画思考 一.如何使用 1)我们需要构建什么 2)如 ...

  9. Markov不等式,Chebyshev不等式

    在切诺夫界的证明中用到了Markov不等式,证明于此~顺便把Chebyshev不等式也写上了

  10. 面试的妹纸问我:web缓存设置不是后台的事情吗?

    背景介绍 团队最近在招前端开发,早上收到一封简历,是个妹纸,从技能点来看还算符合要求,于是约了下午3点过来面试. 整个面试过程持续了大约40分钟,问的题目也比较常规,其中一道题就是"常见的性 ...