博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
蓝桥杯 - [2013年第四届真题]横向打印二叉树(排序二叉树)
阅读量:1998 次
发布时间:2019-04-28

本文共 2877 字,大约阅读时间需要 9 分钟。

题目链接:

时间限制:1.0s 内存限制:256.0MB

问题描述

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

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

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

...|-12

10-|
...|-8-|
.......|...|-7
.......|-5-|
...........|-4

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

输入格式

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

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

输出格式

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

样例输入

10 5 20

5 10 20 8 4 7

样例输出

...|-20

10-|
...|-5

.......|-20

..|-10-|
..|....|-8-|
..|........|-7
5-|
..|-4

解题思路

这道题应该考察的是排序二叉树和对字符串的处理。

首先我们可以发现:

1.一行只有一个数;
2.字符只有'.', '-', '|'三种;
3.非第一列的数前面都有"|-";
4.非叶子节点的数后面都有"-|";

我们可以先整理好的二叉树存到字符串数组里面,然后再插入'|'.

#include 
using namespace std;struct edge { int lson, rson, num, row;}tree[105];int cnt = 1, row = 0;char str[105][605];void Create(int root, int delta) { if (tree[root].num < delta) { if (tree[root].rson != -1) Create(tree[root].rson, delta); else { tree[root].rson = cnt; tree[cnt++].num = delta; } } else { if (tree[root].lson != -1) Create(tree[root].lson, delta); else { tree[root].lson = cnt; tree[cnt++].num = delta; } }}int get_dig(int n) {//计算数字的位数 int cnt = 0; while (n) { cnt++; n /= 10; } return cnt;}void print_1(int root, int col, int num) {//将二叉树存到数组里面 int pre = num + get_dig(tree[root].num) + (!col ? 1 : 3); if (tree[root].rson != -1)//寻找右子树,往上走 print_1(tree[root].rson, col + 1, pre); for (int i = 0; i < num; i++) str[row][i] = '.'; if (!col) {//第一列 if (tree[root].lson != -1 || tree[root].rson != -1) sprintf(str[row] + num, "%d%s", tree[root].num, "-|"); else sprintf(str[row] + num, "%d", tree[root].num); } else { if (tree[root].lson != -1 || tree[root].rson != -1) sprintf(str[row] + num, "%s%d%s", "|-", tree[root].num, "-|"); else sprintf(str[row] + num, "%s%d", "|-", tree[root].num); } tree[root].row = row++;//进入下一行 if (tree[root].lson != -1) print_1(tree[root].lson, col + 1, pre);}void print_2(int root, int col, int num) {//往数组里面插入'|' int pre = num + get_dig(tree[root].num) + (!col ? 1 : 3); if (tree[root].rson != -1) { print_2(tree[root].rson, col + 1, pre); for (int i = tree[tree[root].rson].row; i < tree[root].row; i++) str[i][pre] = '|'; } if (tree[root].lson != -1) { print_2(tree[root].lson, col + 1, pre); for (int i = tree[tree[root].lson].row; i > tree[root].row; i--) str[i][pre] = '|'; }}int main() { int delta; memset(tree, -1, sizeof(tree)); scanf("%d", &delta); tree[0].num = delta; while (~scanf("%d", &delta)) Create(0, delta); row = 0; print_1(0, 0, 0); print_2(0, 0, 0); for (int i = 0; i < row; i++) printf("%s\n", str[i]); return 0;}

转载地址:http://qmftf.baihongyu.com/

你可能感兴趣的文章
iOS 控件截图、MP4格式视频流和m3u8格式视频流截取某一帧功能的实现
查看>>
浅谈App开发iOS端的架构设计
查看>>
iOS开发编码规范小结
查看>>
git 首次切换到已经存在的分支
查看>>
iOS UIViewController基类的实现
查看>>
iOS 含tableView的ViewController基类的实现
查看>>
Android java.lang.IllegalArgumentException: pointerIndex out of range
查看>>
【redis】redis与关系型数据库的比较
查看>>
Android Listview addHeaderView setadapter的时候莫名NullPointerException 解决
查看>>
android优化 清除无效代码 UCDetector
查看>>
Android lint 删除无用图片文件和配置文件
查看>>
Android Edittext 显示光标 获取焦点 监听焦点
查看>>
【Redis】主从复制
查看>>
Android Hawk数据库 github开源项目
查看>>
Android studio 插件安装
查看>>
【Redis】持久化
查看>>
Android studio图片ERROR: 9-patch image xx .9.png malformed
查看>>
Android Studio BUILD FAILED finished with non-zero exit value
查看>>
Android Webview upload 图片上传
查看>>
【Redis】初了解
查看>>