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));
|
|||
|
}
|