Advertisement
Guest User

Untitled

a guest
Dec 12th, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.32 KB | None | 0 0
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3.  
  4. MainWindow::MainWindow(QWidget *parent)
  5. : QMainWindow(parent)
  6. , ui(new Ui::MainWindow)
  7. {
  8. ui->setupUi(this);
  9. scene = new QGraphicsScene(this);
  10. ui->treeView->setScene(scene);
  11. }
  12.  
  13. MainWindow::~MainWindow()
  14. {
  15. delete ui;
  16. }
  17.  
  18. int TreeNode::getKey() const {
  19. return key;
  20. }
  21.  
  22. void TreeNode::setKey(int key) {
  23. TreeNode::key = key;
  24. }
  25.  
  26. TreeNode * TreeNode::getLeft() const {
  27. return left;
  28. }
  29.  
  30. void TreeNode::setLeft(TreeNode *left) {
  31. TreeNode::left = left;
  32. }
  33.  
  34. TreeNode * TreeNode::getRight() const {
  35. return right;
  36. }
  37.  
  38. void TreeNode::setRight(TreeNode *right) {
  39. TreeNode::right = right;
  40. }
  41.  
  42. TreeNode * TreeNode::getParent() const {
  43. return parent;
  44. }
  45.  
  46. void TreeNode::setParent(TreeNode *parent) {
  47. TreeNode::parent = parent;
  48. }
  49.  
  50.  
  51. void MainWindow::addTreeNode(TreeNode *root, int key) {
  52. if (!root) {
  53. return;
  54. }
  55. TreeNode *toAdd = new TreeNode(key);
  56. TreeNode *cur = root;
  57. TreeNode *prev = root;
  58. while (cur) {
  59. prev = cur;
  60. if (cur->getKey() > key) { // going to the left
  61. cur = cur->getLeft();
  62. } else if (cur->getKey() < key) { // going to the right
  63. cur = cur->getRight();
  64. } else { // considering all nodes in a tree as unique
  65. return;
  66. }
  67. }
  68. if (prev->getKey() > key) {
  69. prev->setLeft(toAdd);
  70. } else if (prev->getKey() < key) {
  71. prev->setRight(toAdd);
  72. }
  73. toAdd->setParent(prev);
  74. return;
  75. }
  76.  
  77. void MainWindow::removeTreeNode(Tree *tree, TreeNode *node, int key) {
  78. if (!node) {
  79. return;
  80. }
  81. if (key > node->getKey()) {
  82. removeTreeNode(tree, node->getRight(), key);
  83. } else if (key < node->getKey()) {
  84. removeTreeNode(tree, node->getLeft(), key);
  85. } else {
  86. if (node->getLeft() == nullptr && node->getRight() == nullptr) {
  87. if (node->getParent()) {
  88. TreeNode *parent = node->getParent();
  89. if (parent->getLeft() == node) {
  90. parent->setLeft(nullptr);
  91. } else {
  92. parent->setRight(nullptr);
  93. }
  94. }
  95. if (tree->getRoot() == node) {
  96. tree->setRoot(nullptr);
  97. }
  98. delete node;
  99. } else if (node->getLeft() == nullptr || node->getRight() == nullptr) {
  100. TreeNode *child = node->getLeft() == nullptr ? node->getRight() : node->getLeft();
  101. node->setKey(child->getKey());
  102. node->setRight(child->getRight());
  103. node->setLeft(child->getLeft());
  104. if (child->getLeft()) {
  105. child->getLeft()->setParent(node);
  106. }
  107. if (child->getRight()) {
  108. child->getRight()->setParent(node);
  109. }
  110. delete child;
  111. } else {
  112. if (node->getRight()->getLeft() == nullptr) {
  113. TreeNode *child = node->getRight();
  114. node->setKey(child->getKey());
  115. node->setRight(child->getRight());
  116. if (child->getRight()) {
  117. child->getRight()->setParent(node);
  118. }
  119. delete child;
  120. } else {
  121. TreeNode *cur = node->getRight();
  122. while (cur->getLeft()) {
  123. cur = cur->getLeft();
  124. }
  125. node->setKey(cur->getKey());
  126. removeTreeNode(tree, node->getRight(), cur->getKey());
  127. }
  128. }
  129. }
  130. }
  131.  
  132.  
  133. int MainWindow::height(TreeNode * a) {
  134. if (!a) return 0;
  135. return std::max(height(a->getLeft()), height(a->getRight())) + 1;
  136. }
  137.  
  138. void MainWindow::print_tree(TreeNode* a, int x, int y)
  139. {
  140. if (!a) return;
  141.  
  142. const int offset = 30;
  143. const int r = 25;
  144.  
  145. if (a->getLeft())
  146. {
  147. QLine line(x + r, y + r, x - offset * height(a->getLeft()) * height(a->getLeft()) + 10, y + 90);
  148. scene->addLine(line, QPen(Qt::black));
  149. }
  150.  
  151. if (a->getRight())
  152. {
  153. QLine line(x + r, y + r, x + offset * height(a->getRight()) * height(a->getRight()) + 35, y + 90);
  154. scene->addLine(line, QPen(Qt::black));
  155. }
  156.  
  157. for (double i = 2.0; i >= 0.0; i -= 0.1)
  158. scene->addEllipse(x - i, y - i, 2 * (r + i), 2 * (r + i), QPen(Qt::black), QBrush(Qt::white));
  159.  
  160.  
  161. QGraphicsTextItem* txtItem =
  162. new QGraphicsTextItem(QString(a->getKey()));
  163.  
  164.  
  165. txtItem->setPos(x + 15, y + 15);
  166. scene->addItem(txtItem);
  167.  
  168. if (a->getLeft()) {
  169. print_tree(a->getLeft(), x - offset * height(a->getLeft()) * height(a->getLeft()), y + 75);
  170. }
  171.  
  172. if (a->getRight()) {
  173. print_tree(a->getRight(), x + offset * height(a->getRight()) * height(a->getRight()), y + 75);
  174. }
  175.  
  176. }
  177.  
  178.  
  179.  
  180.  
  181. void MainWindow::on_pushButton_clicked()
  182. {
  183. scene->clear();
  184. int cur;
  185. TreeNode *root = nullptr;
  186. QString input = ui->line->text();
  187. const char* str = input.toStdString().c_str();
  188. int n = input.length();
  189. for (int i = 0; i < n; ++i) {
  190. cur = str[i];
  191. if (!root) {
  192. root = new TreeNode(cur, nullptr);
  193. } else {
  194. addTreeNode(root, cur);
  195. }
  196. }
  197. print_tree(root, ui->treeView->geometry().x()/2, 0);
  198.  
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement