├── 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 | 
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 |
230 |
231 |
232 | TopToolBarArea
233 |
234 |
235 | false
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
--------------------------------------------------------------------------------