// // Created by 423A35C7 on 2023-11-12. // // 11:47 // 14:55 #include #include #include #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)); }