用于存放学校的作业便于复习。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
2.7 KiB

  1. //
  2. // Created by 423A35C7 on 2023-11-12.
  3. //
  4. // 11:47
  5. // 14:55
  6. #include <algorithm>
  7. #include <iostream>
  8. #include <string>
  9. #include "bitree.cpp"
  10. #define move_and_output(x, y, str) printf("\033[s\033[%d;%dH%s\033u", x, y, str)
  11. // 移动并输出到指定位置
  12. #define moveto(x, y) printf("\033[s\033[%d;%dH", x, y)
  13. // 移动到指定位置
  14. #define movedown(x) printf("\033[%dB", (x))
  15. // 向下移动指定行
  16. #define save_cursor() printf("\033[s")
  17. // 保存光标位置
  18. #define restore_cursor() printf("\033[u")
  19. // 恢复光标位置
  20. #define clear_char(num) \
  21. for (int i = 0; i < num; i++) \
  22. printf(" ")
  23. // 清空指定位置的字符
  24. #define clear_screen() printf("\033[2J")
  25. // class ViewBox {
  26. // Node *left_node;
  27. // int x, y;
  28. // int width;
  29. // int height;
  30. // struct Size {
  31. // int width;
  32. // int height;
  33. // };
  34. // Size calculate_size(Node *left_node) {
  35. // Size size {left_node->text.length(), 1};
  36. // if (left_node->left) {
  37. // Size increment;
  38. // increment = calculate_size(left_node->left);
  39. //
  40. // }
  41. // }
  42. // };
  43. enum LINE {NONE, HORIZONTAL, VERTICAL};
  44. int get_length(Node *node) {
  45. // 2是_和空格的长度
  46. return std::to_string(node->num).length() + 2 + node->text.length();
  47. }
  48. void print(Node *node, int x, int y, LINE line_type) {
  49. // 移动到指定位置
  50. moveto(2 * x, y);
  51. // 保存当前光标位置
  52. save_cursor();
  53. // 如果line_type为VERTICAL,则输出“|”
  54. if (line_type == VERTICAL) {
  55. std::cout << "|";
  56. }
  57. // 恢复光标位置
  58. restore_cursor();
  59. // 向下移动1个单位
  60. movedown(1);
  61. // 如果line_type为HORIZONTAL,则输出“——”
  62. if (line_type == HORIZONTAL) {
  63. std::cout << "——";
  64. }
  65. // 输出node的num和text
  66. std::cout << node->num << "_" << node->text << " ";
  67. }
  68. int output(Node *left_node, int x, int y) {
  69. int width = 0;
  70. if (left_node == nullptr) return width;
  71. // 打印左节点
  72. print(left_node, x, y, VERTICAL);
  73. // 计算宽度
  74. width += std::max(get_length(left_node), output(left_node->left, x + 1, y + width));
  75. // 遍历右节点
  76. for (Node *temp = left_node; temp->right && !temp->if_right_chain; temp = temp->right) {
  77. // 打印右节点
  78. print(temp->right, x, y + width, HORIZONTAL);
  79. // 计算宽度
  80. // 2是——的长度
  81. width += std::max(2 + get_length(temp->right), output(temp->right->left, x + 1, y + width));
  82. // width += temp->right->text.length();
  83. }
  84. return width;
  85. // if (left_node->left == nullptr) {
  86. // return width;
  87. // }
  88. // depth += 1;
  89. // return std::max(width, output(left_node->left, depth));
  90. }