java横向打印二叉树_蓝桥杯练习系统历届试题 横向打印二叉树

首先就是题意,把图片顺时针旋转90°..

然后,建立排序二叉树没有问题,

输出...

1.中序遍历递归出每个节点所在行的字符串保存起来,过程中记录当前节点在str中的层数tier和当前节点需要扩展的|位置.

2.递归每个节点到它的左右子树所在层+|.

非常好的关于二叉树的题目.......还真是喜欢这个递归呢.........T_T

附代码:

/*

蓝桥杯横向打印二叉树

首先就是题意,把图片顺时针旋转90°..

然后,建立排序二叉树没有问题,

输出...

1.中序遍历递归出每个节点所在行的字符串保存起来,过程中记录当前节点在str中的层数tier和当前节点需要扩展的|位置.

2.递归每个节点到它的左右子树所在层+|.

*/

#include

#include

#include

using namespace std;

char str[210][30000];

int cnt = 0;

int cntStr = 0;

struct Node {

int val; // 当前节点的值

int lson, rson; // 左右孩子节点的编号

int num; // 当前节点在数组中的编号

int tier; // 表示当前节点在str中是第tier个

int ls; // 当前节点应该扩展的|位置

Node() {

num = -1;

lson = -1;

rson = -1;

tier = -1;

ls = -1;

}

}tree[210];

void add(int rt, int val, int num) { // 参数:根节点 加入的值 加入值的序号

if (tree[rt].val < val) { // 交给右子树

if (tree[rt].rson == -1) {

tree[rt].rson = num;

tree[num].val = val;

tree[num].num = num;

}

else add(tree[rt].rson, val, num);

}

else {

if (tree[rt].lson == -1) {

tree[rt].lson = num;

tree[num].val = val;

tree[num].num = num;

}

else add(tree[rt].lson, val, num);

}

}

void midSearch(int rt) { // 中序遍历

if (tree[rt].rson != -1) {

midSearch(tree[rt].rson);

}

printf("%d\n", tree[rt].val);

if (tree[rt].lson != -1)

midSearch(tree[rt].lson);

}

int getlen(int num) {

int cnt = 0;

while(num) {

num /= 10;

cnt++;

}

return cnt;

}

void printToStr(int rt, int len) { // 每个节点所在的字符串输出到字符串str里 len表示遍历到当前数字的时候 前面已经确定的长度

if (tree[rt].rson != -1) {

printToStr(tree[rt].rson, len + getlen(tree[rt].val) - 1 + (rt == 0 ? 2 : 4));

}

for (int i=0; i

str[cntStr][i] = ‘.‘;

sprintf(str[cntStr]+len, "%s%d%s", rt == 0 ? "\0" : "|-", tree[rt].val, ((tree[rt].lson == -1 && tree[rt].rson == -1) ? "\n" : "-|\n"));

tree[rt].tier = cntStr;

if (tree[rt].lson != -1 || tree[rt].rson != -1)

tree[rt].ls = len + (rt == 0 ? 0 : 2) + getlen(tree[rt].val) + 1;

//cout << tree[rt].ls << "*\n";

cntStr++;

if (tree[rt].lson != -1) {

printToStr(tree[rt].lson, len + getlen(tree[rt].val) - 1 + (rt == 0 ? 2 : 4));

}

}

void format(int rt) { // 将字符串里的|加上 len表示当前节点的|位置

if (tree[rt].rson != -1) {

format(tree[rt].rson);

for (int i=tree[tree[rt].rson].tier; i<=tree[rt].tier; ++i) {

str[i][tree[rt].ls] = ‘|‘;

}

}

if (tree[rt].lson != -1) {

format(tree[rt].lson);

for (int i=tree[rt].tier; i<=tree[tree[rt].lson].tier; ++i) {

str[i][tree[rt].ls] = ‘|‘;

}

}

}

int main() {

// freopen("1.in.cpp", "r", stdin);

int n;

scanf("%d", &n);

tree[0].val = n; // 根节点为0

tree[0].num = 0;

while(~scanf("%d", &n)) {

add(0, n, ++cnt); // 在二叉树上加入n

}

printToStr(0, 0); // 每个节点对应的字符串加入到str中

format(0);

for (int i=0; i

printf("%s", str[i]);

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值