├── LICENSE ├── README.md ├── TreeVisualization.pro ├── TreeVisualization.pro.user ├── git_out.gif ├── main.cpp ├── tree.cpp ├── tree.h ├── visualtree.cpp ├── visualtree.h └── visualtree.ui /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 NotaRobotexe 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BinaryTreeVisualiser 2 | I was doing some exercises with binary trees and then I got idea why not visualise one of them. 3 | ![](git_out.gif) 4 | 5 | Written in C++ with Qt framework. 6 | -------------------------------------------------------------------------------- /TreeVisualization.pro: -------------------------------------------------------------------------------- 1 | #------------------------------------------------- 2 | # 3 | # Project created by QtCreator 2018-10-29T00:22:06 4 | # 5 | #------------------------------------------------- 6 | 7 | QT += core gui 8 | 9 | greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 10 | 11 | TARGET = TreeVisualization 12 | TEMPLATE = app 13 | 14 | # The following define makes your compiler emit warnings if you use 15 | # any feature of Qt which has been marked as deprecated (the exact warnings 16 | # depend on your compiler). Please consult the documentation of the 17 | # deprecated API in order to know how to port your code away from it. 18 | DEFINES += QT_DEPRECATED_WARNINGS 19 | 20 | # You can also make your code fail to compile if you use deprecated APIs. 21 | # In order to do so, uncomment the following line. 22 | # You can also select to disable deprecated APIs only up to a certain version of Qt. 23 | #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 24 | 25 | 26 | SOURCES += \ 27 | main.cpp \ 28 | visualtree.cpp \ 29 | tree.cpp 30 | 31 | HEADERS += \ 32 | visualtree.h \ 33 | tree.h 34 | 35 | FORMS += \ 36 | visualtree.ui 37 | -------------------------------------------------------------------------------- /TreeVisualization.pro.user: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | EnvironmentId 7 | {51b386aa-6017-4508-8ea8-2274c45d09fc} 8 | 9 | 10 | ProjectExplorer.Project.ActiveTarget 11 | 0 12 | 13 | 14 | ProjectExplorer.Project.EditorSettings 15 | 16 | true 17 | false 18 | true 19 | 20 | Cpp 21 | 22 | CppGlobal 23 | 24 | 25 | 26 | QmlJS 27 | 28 | QmlJSGlobal 29 | 30 | 31 | 2 32 | UTF-8 33 | false 34 | 4 35 | false 36 | 80 37 | true 38 | true 39 | 1 40 | true 41 | false 42 | 0 43 | true 44 | true 45 | 0 46 | 8 47 | true 48 | 1 49 | true 50 | true 51 | true 52 | false 53 | 54 | 55 | 56 | ProjectExplorer.Project.PluginSettings 57 | 58 | 59 | 60 | ProjectExplorer.Project.Target.0 61 | 62 | Desktop 63 | Desktop 64 | {6060918a-6bc0-4b10-8d4b-86d0fed92180} 65 | 0 66 | 0 67 | 0 68 | 69 | /home/notarobot/Desktop/TreeVisualizer/build-TreeVisualization-Desktop-Debug 70 | 71 | 72 | true 73 | qmake 74 | 75 | QtProjectManager.QMakeBuildStep 76 | true 77 | 78 | false 79 | false 80 | false 81 | 82 | 83 | true 84 | Make 85 | 86 | Qt4ProjectManager.MakeStep 87 | 88 | -w 89 | -r 90 | 91 | false 92 | 93 | 94 | 95 | 2 96 | Build 97 | 98 | ProjectExplorer.BuildSteps.Build 99 | 100 | 101 | 102 | true 103 | Make 104 | 105 | Qt4ProjectManager.MakeStep 106 | 107 | -w 108 | -r 109 | 110 | true 111 | clean 112 | 113 | 114 | 1 115 | Clean 116 | 117 | ProjectExplorer.BuildSteps.Clean 118 | 119 | 2 120 | false 121 | 122 | Debug 123 | 124 | Qt4ProjectManager.Qt4BuildConfiguration 125 | 2 126 | true 127 | 128 | 129 | /home/notarobot/Desktop/TreeVisualizer/build-TreeVisualization-Desktop-Release 130 | 131 | 132 | true 133 | qmake 134 | 135 | QtProjectManager.QMakeBuildStep 136 | false 137 | 138 | false 139 | false 140 | false 141 | 142 | 143 | true 144 | Make 145 | 146 | Qt4ProjectManager.MakeStep 147 | 148 | -w 149 | -r 150 | 151 | false 152 | 153 | 154 | 155 | 2 156 | Build 157 | 158 | ProjectExplorer.BuildSteps.Build 159 | 160 | 161 | 162 | true 163 | Make 164 | 165 | Qt4ProjectManager.MakeStep 166 | 167 | -w 168 | -r 169 | 170 | true 171 | clean 172 | 173 | 174 | 1 175 | Clean 176 | 177 | ProjectExplorer.BuildSteps.Clean 178 | 179 | 2 180 | false 181 | 182 | Release 183 | 184 | Qt4ProjectManager.Qt4BuildConfiguration 185 | 0 186 | true 187 | 188 | 189 | /home/notarobot/Desktop/TreeVisualizer/build-TreeVisualization-Desktop-Profile 190 | 191 | 192 | true 193 | qmake 194 | 195 | QtProjectManager.QMakeBuildStep 196 | true 197 | 198 | false 199 | true 200 | false 201 | 202 | 203 | true 204 | Make 205 | 206 | Qt4ProjectManager.MakeStep 207 | 208 | -w 209 | -r 210 | 211 | false 212 | 213 | 214 | 215 | 2 216 | Build 217 | 218 | ProjectExplorer.BuildSteps.Build 219 | 220 | 221 | 222 | true 223 | Make 224 | 225 | Qt4ProjectManager.MakeStep 226 | 227 | -w 228 | -r 229 | 230 | true 231 | clean 232 | 233 | 234 | 1 235 | Clean 236 | 237 | ProjectExplorer.BuildSteps.Clean 238 | 239 | 2 240 | false 241 | 242 | Profile 243 | 244 | Qt4ProjectManager.Qt4BuildConfiguration 245 | 0 246 | true 247 | 248 | 3 249 | 250 | 251 | 0 252 | Deploy 253 | 254 | ProjectExplorer.BuildSteps.Deploy 255 | 256 | 1 257 | Deploy locally 258 | 259 | ProjectExplorer.DefaultDeployConfiguration 260 | 261 | 1 262 | 263 | 264 | false 265 | false 266 | 1000 267 | 268 | true 269 | 270 | false 271 | false 272 | false 273 | false 274 | true 275 | 0.01 276 | 10 277 | true 278 | 1 279 | 25 280 | 281 | 1 282 | true 283 | false 284 | true 285 | valgrind 286 | 287 | 0 288 | 1 289 | 2 290 | 3 291 | 4 292 | 5 293 | 6 294 | 7 295 | 8 296 | 9 297 | 10 298 | 11 299 | 12 300 | 13 301 | 14 302 | 303 | 2 304 | 305 | TreeVisualization 306 | 307 | Qt4ProjectManager.Qt4RunConfiguration:/home/notarobot/Desktop/TreeVisualizer/TreeVisualization/TreeVisualization.pro 308 | true 309 | 310 | TreeVisualization.pro 311 | false 312 | 313 | /home/notarobot/Desktop/TreeVisualizer/build-TreeVisualization-Desktop-Debug 314 | 3768 315 | false 316 | true 317 | false 318 | false 319 | true 320 | 321 | 1 322 | 323 | 324 | 325 | ProjectExplorer.Project.TargetCount 326 | 1 327 | 328 | 329 | ProjectExplorer.Project.Updater.FileVersion 330 | 18 331 | 332 | 333 | Version 334 | 18 335 | 336 | 337 | -------------------------------------------------------------------------------- /git_out.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NotaRobotexe/BinaryTreeVisualiser/ae60d8b24d1a5de9474b9ee14f057c2743296536/git_out.gif -------------------------------------------------------------------------------- /main.cpp: -------------------------------------------------------------------------------- 1 | #include "visualtree.h" 2 | #include 3 | 4 | int main(int argc, char *argv[]) 5 | { 6 | QApplication a(argc, argv); 7 | VisualTree w; 8 | w.show(); 9 | 10 | return a.exec(); 11 | } 12 | -------------------------------------------------------------------------------- /tree.cpp: -------------------------------------------------------------------------------- 1 | #include "tree.h" 2 | #include 3 | #include 4 | #include 5 | 6 | namespace Tree { 7 | 8 | Node::Node(Data NewData) { 9 | _data = NewData; 10 | } 11 | 12 | Node::~Node() { 13 | delete _left; 14 | delete _right; 15 | } 16 | 17 | bool Node::IsSymetrical() { 18 | std::vector left_side; 19 | std::vector right_side; 20 | _left->SymetricalChecking(left_side); 21 | _right->SymetricalChecking(right_side); 22 | 23 | if (left_side.size() != right_side.size()) 24 | { 25 | return false; 26 | } 27 | 28 | for (size_t i = 0; i < left_side.size(); i++) 29 | { 30 | if (left_side[i] != right_side[i]) 31 | { 32 | return false; 33 | } 34 | } 35 | 36 | return true; 37 | 38 | } 39 | 40 | void Node::SymetricalChecking(std::vector& vec) { 41 | if (_left != nullptr && _right != nullptr) 42 | { 43 | vec.push_back(0); 44 | _left->SymetricalChecking(vec); 45 | _right->SymetricalChecking(vec); 46 | } 47 | else if (_left != nullptr) 48 | { 49 | vec.push_back(-1); 50 | _left->SymetricalChecking(vec); 51 | } 52 | else if (_right != nullptr) 53 | { 54 | vec.push_back(1); 55 | _right->SymetricalChecking(vec); 56 | } 57 | else 58 | { 59 | vec.push_back(2); 60 | } 61 | } 62 | 63 | void Node::Insert(Data NewData) { 64 | if (NewData.val < _data.val) 65 | { 66 | if (_left == nullptr){ 67 | left_nodes++; 68 | _left = new Node(NewData); 69 | _left->_data.new_node = true; 70 | } 71 | else{ 72 | _left->Insert(NewData); 73 | } 74 | 75 | } 76 | else if (NewData.val > _data.val) 77 | { 78 | if (_right == nullptr){ 79 | right_nodes++; 80 | _right = new Node(NewData); 81 | _right->_data.new_node = true; 82 | } 83 | else{ 84 | _right->Insert(NewData); 85 | } 86 | } 87 | } 88 | 89 | void Node::ResetLastLabel(){ 90 | if (_left != nullptr){ 91 | _left->_data.new_node = false; 92 | _left->ResetLastLabel(); 93 | } 94 | 95 | if (_right != nullptr){ 96 | _right->_data.new_node = false; 97 | _right->ResetLastLabel(); 98 | } 99 | } 100 | 101 | bool Node::Contain(int number) { 102 | if (number < _data.val) { 103 | if (_left == nullptr){ 104 | return false; 105 | } 106 | else { 107 | _left->Contain(number); 108 | } 109 | } 110 | else if (number > _data.val) 111 | { 112 | if (_right == nullptr) { 113 | return false; 114 | } 115 | else { 116 | _right->Contain(number); 117 | } 118 | } 119 | else { 120 | return true; 121 | } 122 | } 123 | 124 | int Node::GetSmallestNumber() { 125 | if (_left == nullptr){ 126 | return _data.val; 127 | } 128 | else{ 129 | _left->GetSmallestNumber(); 130 | } 131 | } 132 | 133 | int Node::GetLargestNumber() { 134 | if (_right == nullptr) { 135 | return _data.val; 136 | } 137 | else { 138 | _right->GetLargestNumber(); 139 | } 140 | } 141 | 142 | void Node::GetSortedVector(std::vector& a) 143 | { 144 | if (_left != nullptr){ 145 | _left->GetSortedVector(a); 146 | } 147 | a.push_back(_data.val); 148 | 149 | if (_right != nullptr){ 150 | _right->GetSortedVector(a); 151 | } 152 | } 153 | 154 | std::vector Node::SetPositionOfNodesForVisualization(){ 155 | int level{0},pos{1}; 156 | this->SetLevel(level); 157 | this->SetPos(pos); 158 | this->SetDataForDrawing(*this); 159 | std::vector vec; 160 | this->ReturnDataVector(vec); 161 | 162 | return vec; 163 | 164 | } 165 | 166 | 167 | std::vector Node::GetVectorOfLinesBetwenNodes(){ 168 | std::vector vec; 169 | this->LoopForLinesConnection(vec); 170 | return vec; 171 | } 172 | 173 | void Node::LoopForLinesConnection(std::vector& vec){ 174 | 175 | if(_left != nullptr){ 176 | QPoint point(_data.posX,_data.posY); 177 | vec.push_back(point); 178 | _left->LoopForLinesConnection(vec); 179 | } 180 | 181 | if(_right != nullptr){ 182 | QPoint point(_data.posX,_data.posY); 183 | vec.push_back(point); 184 | _right->LoopForLinesConnection(vec); 185 | } 186 | 187 | QPoint point(_data.posX,_data.posY); 188 | vec.push_back(point); 189 | } 190 | 191 | void Node::ReturnDataVector(std::vector& vector){ 192 | if(_left != nullptr){ 193 | _left->ReturnDataVector(vector); 194 | } 195 | 196 | vector.push_back(_data); 197 | 198 | if(_right != nullptr){ 199 | _right->ReturnDataVector(vector); 200 | } 201 | } 202 | 203 | 204 | void Node::SetDataForDrawing(Node& root){ 205 | if(_left != nullptr){ 206 | _left->SetDataForDrawing(root); 207 | } 208 | 209 | _data.posY = (_data.level* root.DrawingSize)+root.start_pos.y(); 210 | if(_data.pos < root._data.pos){ 211 | _data.posX = root.start_pos.x() - ((root._data.pos - _data.pos)*root.DrawingSize); 212 | } 213 | else if(_data.pos > root._data.pos){ 214 | _data.posX = root.start_pos.x() + ((_data.pos - root._data.pos)*root.DrawingSize); 215 | } 216 | else{ 217 | _data.posX = root.start_pos.x(); 218 | } 219 | 220 | if(_right != nullptr){ 221 | _right->SetDataForDrawing(root); 222 | } 223 | } 224 | 225 | void Node::SetPos(int &pos){ 226 | if(_left != nullptr){ 227 | _left->SetPos(pos); 228 | } 229 | _data.pos = pos; 230 | pos++; 231 | if(_right != nullptr){ 232 | _right->SetPos(pos); 233 | } 234 | } 235 | 236 | void Node::SetLevel(int& level){ 237 | _data.level = level; 238 | level++; 239 | if(_left != nullptr){ 240 | _left->SetLevel(level); 241 | } 242 | if(_right != nullptr){ 243 | _right->SetLevel(level); 244 | } 245 | level--; 246 | } 247 | } 248 | -------------------------------------------------------------------------------- /tree.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | 5 | namespace Tree { 6 | struct Data { 7 | int val; 8 | int level; 9 | int pos; 10 | int posX{0}; 11 | int posY{0}; 12 | bool new_node{false}; 13 | }; 14 | 15 | class Node 16 | { 17 | public: 18 | const int DrawingSize{34}; 19 | const QPoint start_pos{360,150}; 20 | 21 | static int left_nodes; 22 | static int right_nodes; 23 | Data _data; 24 | 25 | bool Contain(int number); 26 | int GetSmallestNumber(); 27 | int GetLargestNumber(); 28 | void GetSortedVector(std::vector& a); 29 | void Insert(Data NewData); 30 | bool IsSymetrical(); 31 | void ResetLastLabel(); 32 | 33 | std::vector SetPositionOfNodesForVisualization(); 34 | std::vector GetVectorOfLinesBetwenNodes(); 35 | 36 | Node(Data NewData); 37 | ~Node(); 38 | 39 | private: 40 | Node *_left = nullptr, *_right = nullptr; 41 | 42 | void ReturnDataVector(std::vector& vector); 43 | void LoopForLinesConnection(std::vector& vec); 44 | void SetDataForDrawing(Node& root); 45 | void SetPos(int& pos); 46 | void SetLevel(int& level); 47 | void SymetricalChecking(std::vector& vec); 48 | }; 49 | } 50 | -------------------------------------------------------------------------------- /visualtree.cpp: -------------------------------------------------------------------------------- 1 | #include "visualtree.h" 2 | #include "ui_visualtree.h" 3 | #include 4 | #include 5 | #include "tree.h" 6 | #include 7 | #include 8 | #include 9 | 10 | 11 | int Tree::Node::left_nodes = 0; 12 | int Tree::Node::right_nodes = 0; 13 | 14 | VisualTree::VisualTree(QWidget *parent) : 15 | QMainWindow(parent), 16 | ui(new Ui::VisualTree) 17 | { 18 | ui->setupUi(this); 19 | } 20 | 21 | VisualTree::~VisualTree() 22 | { 23 | delete _node; 24 | delete ui; 25 | } 26 | 27 | void VisualTree::on_insert_button_clicked() 28 | { 29 | QString raw_data = ui->Input_text->text(); 30 | ui->Input_text->setText(""); 31 | 32 | if(raw_data.contains(",")){ 33 | _node->ResetLastLabel(); 34 | QStringList split_data = raw_data.split(","); 35 | 36 | for(const auto &a : split_data){ 37 | Tree::Data _data; 38 | _data.val = a.toInt(); 39 | _node->Insert(_data); 40 | 41 | ui->largest_num->setText(QString::number(_node->GetLargestNumber())); 42 | ui->smllest_num->setText(QString::number(_node->GetSmallestNumber())); 43 | ui->left_branch->setText(QString::number(Tree::Node::left_nodes)); 44 | ui->right_branch->setText(QString::number(Tree::Node::right_nodes)); 45 | } 46 | } 47 | else{ 48 | Tree::Data _data; 49 | _data.val = raw_data.toInt(); 50 | if(!(_node->Contain(raw_data.toInt()))){ 51 | _node->ResetLastLabel(); 52 | _node->Insert(_data); 53 | 54 | ui->largest_num->setText(QString::number(_node->GetLargestNumber())); 55 | ui->smllest_num->setText(QString::number(_node->GetSmallestNumber())); 56 | ui->left_branch->setText(QString::number(Tree::Node::left_nodes)); 57 | ui->right_branch->setText(QString::number(Tree::Node::right_nodes)); 58 | } 59 | } 60 | 61 | if(_node->IsSymetrical()==1){ 62 | ui->symetrcal_lab->setText("Yes"); 63 | } 64 | else{ 65 | ui->symetrcal_lab->setText("No"); 66 | } 67 | 68 | DrawTree = true; 69 | update(); 70 | } 71 | 72 | void VisualTree::on_Root_set_clicked() 73 | { 74 | int root = ui->Root_inp->text().toInt(); 75 | 76 | Tree::Data r_data; 77 | r_data.val = root; 78 | 79 | _node = new Tree::Node(r_data); 80 | 81 | ui->Root_inp->setEnabled(false); 82 | ui->Root_set->setEnabled(false); 83 | } 84 | 85 | void VisualTree::paintEvent(QPaintEvent *event){ 86 | if(DrawTree == true){ 87 | QPainter paint_node(this); 88 | paint_node.setPen(QPen(Qt::black,2)); 89 | std::vector nodes_data = _node->SetPositionOfNodesForVisualization(); 90 | 91 | const int size = _node->DrawingSize/2; 92 | QPoint line_pos; 93 | line_pos.setX(_node->start_pos.x()+size); 94 | line_pos.setY(_node->start_pos.y()+size); 95 | std::vector nodes_lines = _node->GetVectorOfLinesBetwenNodes(); 96 | for(const auto& a : nodes_lines){ 97 | paint_node.drawLine(line_pos.x(),line_pos.y(),a.x()+size,a.y()+size); 98 | line_pos.setX(a.x()+size); 99 | line_pos.setY(a.y()+size); 100 | } 101 | 102 | paint_node.setBrush(QBrush(QColor(Qt::green))); 103 | for(const auto& a : nodes_data){ 104 | QPoint node_pos(a.posX,a.posY); 105 | 106 | if(a.new_node == false){ 107 | paint_node.drawEllipse(a.posX,a.posY,_node->DrawingSize,_node->DrawingSize); 108 | } 109 | else{ 110 | paint_node.setBrush(QBrush(QColor(Qt::red))); 111 | paint_node.drawEllipse(a.posX,a.posY,_node->DrawingSize,_node->DrawingSize); 112 | paint_node.setBrush(QBrush(QColor(Qt::green))); 113 | } 114 | 115 | paint_node.drawText(QRectF(QPointF(node_pos),QSizeF(QSize(34,31))),QString::number(a.val),QTextOption(Qt::AlignCenter)); 116 | } 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /visualtree.h: -------------------------------------------------------------------------------- 1 | #ifndef VISUALTREE_H 2 | #define VISUALTREE_H 3 | 4 | #include 5 | #include 6 | 7 | namespace Ui { 8 | class VisualTree; 9 | } 10 | 11 | class VisualTree : public QMainWindow 12 | { 13 | Q_OBJECT 14 | 15 | public: 16 | explicit VisualTree(QWidget *parent = 0); 17 | virtual void paintEvent(QPaintEvent *event); 18 | ~VisualTree(); 19 | 20 | private slots: 21 | void on_insert_button_clicked(); 22 | 23 | void on_Root_set_clicked(); 24 | 25 | void on_pushButton_clicked(); 26 | 27 | private: 28 | bool DrawTree{false}; 29 | Tree::Node* _node; 30 | Ui::VisualTree *ui; 31 | }; 32 | 33 | #endif // VISUALTREE_H 34 | -------------------------------------------------------------------------------- /visualtree.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | VisualTree 4 | 5 | 6 | 7 | 0 8 | 0 9 | 753 10 | 449 11 | 12 | 13 | 14 | VisualTree 15 | 16 | 17 | 18 | 19 | 20 | 10 21 | 40 22 | 81 23 | 41 24 | 25 | 26 | 27 | Input : 28 | 29 | 30 | 31 | 32 | 33 | 70 34 | 50 35 | 191 36 | 25 37 | 38 | 39 | 40 | 41 | 42 | 43 | 280 44 | 50 45 | 89 46 | 25 47 | 48 | 49 | 50 | Insert 51 | 52 | 53 | 54 | 55 | 56 | 10 57 | 10 58 | 81 59 | 21 60 | 61 | 62 | 63 | Root : 64 | 65 | 66 | 67 | 68 | 69 | 70 70 | 10 71 | 113 72 | 25 73 | 74 | 75 | 76 | 77 | 78 | 79 | 190 80 | 10 81 | 89 82 | 25 83 | 84 | 85 | 86 | Set 87 | 88 | 89 | 90 | 91 | 92 | 400 93 | 10 94 | 67 95 | 17 96 | 97 | 98 | 99 | Smallest : 100 | 101 | 102 | 103 | 104 | 105 | 470 106 | 10 107 | 67 108 | 17 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 560 119 | 10 120 | 67 121 | 17 122 | 123 | 124 | 125 | Largest : 126 | 127 | 128 | 129 | 130 | 131 | 620 132 | 10 133 | 121 134 | 17 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 400 145 | 30 146 | 91 147 | 17 148 | 149 | 150 | 151 | Symetrical : 152 | 153 | 154 | 155 | 156 | 157 | 490 158 | 30 159 | 67 160 | 17 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 400 171 | 50 172 | 101 173 | 17 174 | 175 | 176 | 177 | Left branches : 178 | 179 | 180 | 181 | 182 | 183 | 500 184 | 50 185 | 67 186 | 17 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 560 197 | 50 198 | 111 199 | 17 200 | 201 | 202 | 203 | Right branches : 204 | 205 | 206 | 207 | 208 | 209 | 670 210 | 50 211 | 67 212 | 17 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 0 224 | 0 225 | 753 226 | 22 227 | 228 | 229 | 230 | 231 | 232 | TopToolBarArea 233 | 234 | 235 | false 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | --------------------------------------------------------------------------------