97 lines
2.7 KiB
C++
97 lines
2.7 KiB
C++
//
|
||
// Created by 423A35C7 on 2023-11-12.
|
||
//
|
||
// 11:47
|
||
// 14:55
|
||
|
||
#include <algorithm>
|
||
#include <iostream>
|
||
#include <string>
|
||
#include "bitree.cpp"
|
||
|
||
#define move_and_output(x, y, str) printf("\033[s\033[%d;%dH%s\033u", x, y, str)
|
||
// 移动并输出到指定位置
|
||
#define moveto(x, y) printf("\033[s\033[%d;%dH", x, y)
|
||
// 移动到指定位置
|
||
#define movedown(x) printf("\033[%dB", (x))
|
||
// 向下移动指定行
|
||
#define save_cursor() printf("\033[s")
|
||
// 保存光标位置
|
||
#define restore_cursor() printf("\033[u")
|
||
// 恢复光标位置
|
||
#define clear_char(num) \
|
||
for (int i = 0; i < num; i++) \
|
||
printf(" ")
|
||
// 清空指定位置的字符
|
||
#define clear_screen() printf("\033[2J")
|
||
|
||
// class ViewBox {
|
||
// Node *left_node;
|
||
// int x, y;
|
||
// int width;
|
||
// int height;
|
||
// struct Size {
|
||
// int width;
|
||
// int height;
|
||
// };
|
||
// Size calculate_size(Node *left_node) {
|
||
// Size size {left_node->text.length(), 1};
|
||
// if (left_node->left) {
|
||
// Size increment;
|
||
// increment = calculate_size(left_node->left);
|
||
//
|
||
// }
|
||
// }
|
||
// };
|
||
|
||
enum LINE {NONE, HORIZONTAL, VERTICAL};
|
||
|
||
int get_length(Node *node) {
|
||
// 2是_和空格的长度
|
||
return std::to_string(node->num).length() + 2 + node->text.length();
|
||
}
|
||
|
||
void print(Node *node, int x, int y, LINE line_type) {
|
||
// 移动到指定位置
|
||
moveto(2 * x, y);
|
||
// 保存当前光标位置
|
||
save_cursor();
|
||
// 如果line_type为VERTICAL,则输出“|”
|
||
if (line_type == VERTICAL) {
|
||
std::cout << "|";
|
||
}
|
||
// 恢复光标位置
|
||
restore_cursor();
|
||
// 向下移动1个单位
|
||
movedown(1);
|
||
// 如果line_type为HORIZONTAL,则输出“——”
|
||
if (line_type == HORIZONTAL) {
|
||
std::cout << "——";
|
||
}
|
||
// 输出node的num和text
|
||
std::cout << node->num << "_" << node->text << " ";
|
||
}
|
||
|
||
int output(Node *left_node, int x, int y) {
|
||
int width = 0;
|
||
if (left_node == nullptr) return width;
|
||
// 打印左节点
|
||
print(left_node, x, y, VERTICAL);
|
||
// 计算宽度
|
||
width += std::max(get_length(left_node), output(left_node->left, x + 1, y + width));
|
||
// 遍历右节点
|
||
for (Node *temp = left_node; temp->right && !temp->if_right_chain; temp = temp->right) {
|
||
// 打印右节点
|
||
print(temp->right, x, y + width, HORIZONTAL);
|
||
// 计算宽度
|
||
// 2是——的长度
|
||
width += std::max(2 + get_length(temp->right), output(temp->right->left, x + 1, y + width));
|
||
// width += temp->right->text.length();
|
||
}
|
||
return width;
|
||
// if (left_node->left == nullptr) {
|
||
// return width;
|
||
// }
|
||
// depth += 1;
|
||
// return std::max(width, output(left_node->left, depth));
|
||
} |