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

这是题目

问题描述

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

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

比如,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

这是分析

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

这是我的思路

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

这是代码

#include<stdio.h>
#include<stdlib.h> #define COLS 10002
#define ROWS 102 char graph[ROWS][COLS];
struct Node
{
int lines;//这个节点应该在第几行被打印
int layer;//这个节点在第几层
int value;
struct Node *left,*right;
};
struct Node *tree; int i_index = 0;
int j_index = 0;
int index=0; void insert(int value)
{
int layer = 1;
int flag = 0;
struct Node *temp,*p;
if(tree==NULL){
//putchar('a');
tree = (struct Node*)malloc(sizeof(struct Node));
tree->layer = layer;
tree->value = value;
tree->right = NULL;
tree->left = NULL;
}else{
//putchar('b');
temp = tree;
while(temp!=NULL){
if(value>temp->value){
if(temp->right!=NULL)
temp = temp->right;
else{
layer++;
flag = 1;
break;
}
}else{
if(temp->left!=NULL)
temp = temp->left;
else{
layer++;
flag = 2;
break;
}
}
layer++;
}
p = (struct Node*)malloc(sizeof(struct Node));
p->left = NULL;
p->right = NULL;
p->layer = layer;
p->value = value;
if(flag==1)
temp->right = p;
else
temp->left = p;
//putchar('d');
}
//putchar('c');
} int getLen(int n)
{
int result = 0;
while(n>0)
{
n/=10;
result++;
}
return result; } void inOrder(struct Node *p)
{
if(p==NULL)
return;
inOrder(p->right);
p->lines = index++;
// printf("%d:%d:%d\n",p->value,p->lines,p->layer);
inOrder(p->left);
}
void DrawFinal(struct Node *p,int j)
{
int up;int down;
int i;
if(p->right==NULL&&p->left==NULL)
return; if(p->right==NULL)
up=p->lines;
else
up=p->right->lines; if(p->left==NULL)
down = p->lines;
else
down=p->left->lines;
for(i = up;i<=down;i++)
graph[i][j] = '|';
}
void inOrderDraw(struct Node *p)
{
int i;
int temp = j_index;
if(p==NULL)
return ;
if(p->right!=NULL)
{
if(p->layer>1)
j_index+=3;
j_index+=getLen(p->value);
inOrderDraw(p->right);
}
j_index = temp; /*for(i=0;i<j_index;i++)
graph[i_index][i] = '.';
*/
i = j_index;
if(p->layer!=1)
{
graph[i_index][i++] = '.';
graph[i_index][i++] = '|';
graph[i_index][i++] = '-';
}
i+= sprintf(graph[i_index]+i,"%d",p->value);
if(p->left!=NULL||p->right!=NULL)
{
graph[i_index][i++] = '-';
graph[i_index][i++] = '|';
DrawFinal(p,i-1); }
graph[i_index][i++] = '\n';
graph[i_index][i] = '\0'; i_index++;
if(p->left!=NULL)
{
if(p->layer>1)
j_index+=3;
j_index+=getLen(p->value);
inOrderDraw(p->left);
}
} int main()
{
int i,j;
int num;
char c;
int n=0;
for(i = 0;i<ROWS;i++)
for(j=0;j<COLS;j++)
graph[i][j] = '.'; tree = NULL;
while(1)
{
scanf("%d",&num);
c = getchar();
n++;
insert(num);
if(c=='\n')
break;
} inOrder(tree); inOrderDraw(tree); for(i=0;i<n;i++)
for(j=0;graph[i][j]!='\0';j++)
putchar(graph[i][j]); return 0;
}

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

但是其他人的我也没看懂。。。(: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. 三菱Q系列PLC基本指令讲解

    1.数据传送指令MOV和MOVP,格式为 MOV    SRC1    DES1     表示条件接通,将SRC1的值传送到DES1寄存器中,带P的表示只在条件接通的上升沿指令执行一个扫描周期,不带P ...

  2. Struts2框架入门

    1.1 Struts2概述: 是一个遵循WEB层规范的MVC设实现,该框架基本上借鉴了WebWork框架的体系结构,只吸收了少部分Struts1的优点.是目前JAVA EE项目中WEB层事实上的工业标 ...

  3. C#设计模式(2)-简单工厂模式

    引言 上一遍中介绍了设计模式中的单例模式-C#设计模式(1)-单例模式,本篇将介绍简单工厂模式,也是比较容易理解的一种模式: 简单工厂模式简介 什么是简单工厂模式? 定义一个工厂类,它可以根据参数的不 ...

  4. Python web框架总结

    web框架总结 前提 一个web框架需要包含的组件或者功能有: router orm request and response cookies and session template engine ...

  5. Cognos配置管理

    --Cognos配置管理 --------------------------2014/03/19 进入配置管理界面: /washome/cognos/c10/bin64 ./cogconfig.sh ...

  6. 运营商级NAT(Carrier-grade NAT)

    运营商级NAT(Carrier-grade NAT)   运营商级(Carrier-grade)NAT,是用于缓解是IPV4地址枯竭的一种方法,通过这种方法,原来被分配公网ip的端点.家庭网络等可以被 ...

  7. 关于Java中Eclipse运行卡顿、未响应,Cpu100%的快速处理办法

    1.与近几日我以及我的同事们遇到一件非常奇怪的问题,我们目前在实现一个小程序,但是不知为何,Eclipse突然变得很卡,以为是小问题最后闹到重启都没解决,于是 我开始查找造成这个现象的原因,发现这个程 ...

  8. MFC加载PNG图片并实现双缓冲

    因为PNG包含Alpha通道,所以不同于BITMAP,在MFC中使用CImage类对其进行处理,通常使用load和draw成员函数. 所以标题的论述可以进一步解释为,使用CImage实现双缓冲. 通常 ...

  9. JavaScript之获取节点

    JavaScriopt DOM有三大节点:元素节点.属性节点.文本节点. 其中获取元素节点的三种主要方法有: 1.document.getElementById();此方法根据节点的唯一id值获取节点 ...

  10. mysql、oracle和SQL server数据库的区别

    1.总体对比. SQL,在这里我理解成SQL Server.三者是目前市场占有率最高(依安装量而非收入)的关系数据库,而且很有代表性.排行第四的DB2(属IBM公司),与Oracle的定位和架构非常相 ...