历届试题 横向打印二叉树
时间限制:1.0s 内存限制:256.0MB
提交此题 锦囊1 锦囊2
问题描述
二叉树可以用于排序。其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树。
当遇到空子树时,则把该节点放入那个位置。
比如,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. 如果该结点有子树,则数字的后面有’-’;
  2. 如果该结点有双亲结点,则数字的前面有’-’,不过除了根结点以外,其他结点都有双亲结点,所以就不用设双亲结点指针来判断了;
  3. 如果该树有左孩子,则字符’-‘后面开始,一直向下到左孩子所在的行,都有’|’;
  4. 如果该树有右孩子,则字符’-‘后面开始,一直向上到右孩子所在的行,都有’|’;
  5. 当树画完之后,其余空闲位置,都是字符’.’;
  具体代码如下:

PS:这道题我当时删删改改很多次,懒得整理了,算是我发的代码中较乱的了。不过注释依然是有的,但如果有哪没看懂的,欢迎随时留言。
主要的操作就是printdp这个子函数,将排序二叉树经过处理写入二维数组中,这步操作大家可以借鉴一下。当然,如果有更好的方法,也欢迎随时留言,大家互相探讨。

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;//二叉树的结构体
struct tree
{int data;                              //当前节点的数据 int len;                              //当前节点数字的长度 int c, y;                               //c:当前节点的在树中的层数, y:横向打印的纵坐标 tree *left, *right;                     //左、右子树 tree() { left = right = NULL;}    //树的初始化
};vector<int>     a;                  //存输入的数据
tree            *head = new tree;  //排序二叉树
char            **dp;               //创建二维数组用来打印输出的图形
int             *top;               //创建数组用来存打印时每行的长度
int             cd = 0;                //判断当前节点大小的顺序 //计算数字的长度
int intlen(int num)
{int res = 1;while(num /= 10){res++;}return res;
}//右根左写入y
void printy(tree *h)
{if(h){printy(h->right);h->y = cd++;printy(h->left);}
}//写入排序二叉树
void dfs(tree *&h, int x, int c)
{if(!h){    //如果当前结点为空,则创建并写入数据h = new tree;h->data = x;h->len = intlen(x);h->c = c;return;}if(x < h->data)   dfs(h->left, x, c+1);   //小的放在左边 else           dfs(h->right, x, c+1);  //大的放在右边
}//填写树的图案,深度遍历
void printdp(tree *h, int x)
{if(h){//写前面的'-' if(h->c != 1) dp[h->y][x++] = '-';//写当前节点的值 sprintf(&dp[h->y][x], "%d", h->data);x += h->len;//写后面的'-'if(h->left || h->right)dp[h->y][x++] = '-';//写入连接子树的竖线'|' if(h->right){  //画连接右子树的竖线'|' for(int i = h->right->y; i <= h->y; i++){dp[i][x] = '|';}}if(h->left){   //画连接左子树的竖线'|' for(int i = h->y; i <= h->left->y; i++){dp[i][x] = '|';}}top[h->y] = x; //存该行最后一个元素的下标printdp(h->right, x+1);printdp(h->left, x+1);}
}int main()
{int n = 0;//输入for(int i = 0; cin >> i; n++)a.push_back(i);top = new int[n];dp = new char*[n];for(int i = 0; i < n; i++){dp[i] = new char[n*5];for(int j = 0; j < 5 * n; j++)dp[i][j] = 0;}//存储 //存根节点head->data = a[0];head->len = intlen(a[0]);head->c = 1;//存其他结点for(vector<int>::iterator it = a.begin() + 1; it != a.end(); it++)dfs(head, *it, 1);//写入结点的参数yprinty(head);//写入树的图案printdp(head, 0);//填充空白位置为'.'for(int i = 0; i < n; i++)for(int j = 0; j < top[i]; j++)    //每行不超过top[i]if(!dp[i][j]) dp[i][j] = '.';//输出图案结果for(int i = 0; i < n; i++){cout << dp[i] << endl;}return 0;
}

蓝桥杯 历届试题 PREV-11 横向打印二叉树 排序二叉树相关推荐

  1. 蓝桥杯历届试题代码参考

    蓝桥杯历届试题代码参考 历届试题 核桃的数量 打印十字图 带分数 剪格子 错误票据 翻硬币 连号区间数 买不到的数目 大臣的旅费 幸运数 横向打印二叉树 危险系数 网络寻路 高僧斗法 格子刷油漆 农场 ...

  2. 历届试题+九宫重排+java_蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)...

    Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...

  3. 蓝桥杯 - 历届试题 - 日期问题

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_33531813/article/details/79516258 </div>&l ...

  4. 蓝桥杯c语言试题幸运数,蓝桥杯  历届试题 幸运数  dfs

    时间限制:1.0s   内存限制:256.0MB 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成 . 首先从1开始写出自然数1,2,3,4,5,6,. ...

  5. [蓝桥杯][历届试题]国王的烦恼(反向+并查集)

    问题 1435: [蓝桥杯][历届试题]国王的烦恼 时间限制: 1Sec 内存限制: 128MB 提交: 802 解决: 213 题目描述 C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了 ...

  6. 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索

    问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...

  7. 二分搜索,POJ2456,NYOJ 914, 区间移位-蓝桥杯-历届试题

    二分搜索是不断缩减可能解的范围来得到最优解, 因为每次是折半, 所以指数爆炸有多快,这个效率就有多高 POJ2456为例, 传送门 简而言之, 就是将牛之间的距离的最小值最大化. #include&l ...

  8. 问题 1433: [蓝桥杯][历届试题]危险系数(并查集and暴力)

    问题 1433: [蓝桥杯][历届试题]危险系数 时间限制: 1Sec 内存限制: 128MB 提交: 123 解决: 39 题目描述 问题描述 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的 ...

  9. 蓝桥杯 历届试题 拉马车 java

    Prev43 历届试题 拉马车 题目如下: 问题描述:小的时候,你玩过纸牌游戏吗?有一种叫做"拉马车"的游戏,规则很简单,却很吸引小朋友.其规则简述如下:假设参加游戏的小朋友是A和 ...

最新文章

  1. CentOS学习笔记 - 9. docker maven编译基于gofabric8的java应用镜像
  2. flume ng之组件介绍
  3. 关于sublime-text-2的Package Control组件安装方法,自动和手动
  4. 进入方法内快捷键_肝货|驱动安装流程驱动amp;快捷键设置(一)
  5. Oracle 获取表注释和列注释
  6. Android studio R文件丢失或错误解决方法
  7. 结对项目---万年历
  8. os.getcwd()
  9. 在html字符串拼接函数,通过html字符串连接组合并调用javascript函数
  10. MFC列表控件report报表可编辑操作
  11. Linux学习(一)
  12. MongoDB-day1:MongoDB安装使用、python操作、虚拟环境、windows下pip豆瓣源配置
  13. 用 BCDEdit 命令修改 Windows 多系统启动菜单的名称及显示顺序
  14. LeetCode——110,判断平衡二叉树
  15. 装修小知识 杜绝厨房装修遗憾
  16. 吉林大学算法设计与分析考前突击
  17. VS2010+OPENCV3.4.1永久配置
  18. php 评论插件,织梦评论插件,dedecms评论插件
  19. 江海大作业(仅供参考,需要)
  20. 牛客小白月赛3 B.躲藏

热门文章

  1. [DappReview]2019 Dapp市场报告
  2. CentOS7搭建Nacos Cluster
  3. html移除背景颜色,拆分背景颜色HTML
  4. smack+openfire创建IM群聊、加入群聊、发送消息、退出群聊(openfire学习记录二)...
  5. 7-16 藏头诗 (15 point(s))
  6. POI设置excel某列值为文本格式
  7. Android资源管理框架(Asset Manager)简要介绍和学习计划
  8. Python数据抽样
  9. php 风水起名网站源代码_开运网付费开源商业版 PHP风水起名八字算命易经周易源码...
  10. 【OCM】想考11g和12c OCM的小伙伴可以加我微信(lhrbestxh)私聊,100%通过率,非诚勿扰。...