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