===== Nakresli strom =====
mxGraph https://jgraph.github.io/mxgraph/
#include
#include
using namespace std;
struct Item
{
int key;
Item* left;
Item* right;
// Item () { key = 0; left = nullptr; right = nullptr; }
Item () : key (0), left (nullptr), right (nullptr) { }
};
Item* root = nullptr;
Item* search (Item* p, int value)
{
while (p != nullptr && p->key != value)
{
if (value < p->key)
p = p->left;
else
p = p->right;
}
return p;
}
Item* lookup (Item* p, int value)
{
if (p == nullptr)
return nullptr;
else if (p->key == value)
return p;
else if (value < p->key)
return lookup (p->left, value);
else
return lookup (p->right, value);
}
void insert (Item*& p, int value)
{
if (p == nullptr)
{
Item* t = new Item;
t->key = value;
p = t;
}
else if (p->key == value)
{
}
else if (value < p->key)
{
insert (p->left, value);
}
else
{
insert (p->right, value);
}
}
Item* findAndUnlink (Item*& u)
{
if (u->right == nullptr)
{
Item* w = u;
u = w->left;
w->left = nullptr;
return w;
}
else
{
return findAndUnlink (u->right);
}
}
void remove (Item*& p, int value)
{
if (p == nullptr)
{
}
else if (value < p->key)
{
remove (p->left, value);
}
else if (p->key < value)
{
remove (p->right, value);
}
else
{
// nasli jsme
Item* t = p; // t ... k vymazani
if (p->left == nullptr)
{
p = t->right;
delete t;
}
else if (p->right == nullptr)
{
p = t->left;
delete t;
}
else
{
// dva podstromy
Item* u = findAndUnlink (t->left);
u->left = t->left;
u->right = t->right;
p = u;
delete t;
}
}
}
void print (Item* p)
{
if (p != nullptr)
{
cout << p->key << endl;
print (p->left);
print (p->right);
}
}
void writeNode (ofstream & f, Item * p, int x, int y, int sx, int sy)
{
if (p != nullptr)
{
f << " var v" << p->key << " = graph.insertVertex (parent, null, '" << p->key << "', "
<< x << ", " << y << ", 80, 30);" << endl;
if (p->left != nullptr)
{
writeNode (f, p->left, x-sx, y+sy, sx/2, sy);
f << " graph.insertEdge (parent, null, '', v" << p->key << ", v" << p->left->key << ");" << endl;
}
if (p->right != nullptr)
{
writeNode (f, p->right, x+sx, y+sy, sx/2, sy);
f << " graph.insertEdge (parent, null, '', v" << p->key << ", v" << p->right->key << ");" << endl;
}
}
}
void writeHtml (string fileName, Item * p)
{
ofstream f (fileName);
f << "" << endl;
f << "" << endl;
f << "Tree with mxGraph" << endl;
f << "" << endl;
f << "" << endl;
f << "" << endl;
f << "" << endl;
f << "" << endl;
f << "" << endl;
f << "
" << endl;
f << "" << endl;
f << "" << endl;
f.close ();
string cmd = "\"C:/Program Files/Mozilla Firefox/firefox\" " + fileName;
system (cmd.c_str());
}
int main ()
{
insert (root, 10);
insert (root, 5);
insert (root, 3);
insert (root, 4);
insert (root, 7);
insert (root, 9);
insert (root, 8);
insert (root, 12);
writeHtml ("output1.html", root);
remove (root, 10);
writeHtml ("output2.html", root);
/*
remove (root, 12);
remove (root, 3);
remove (root, 7);
*/
cout << "--------" << endl;
print (root);
cout << "--------" << endl;
Item* t = lookup (root, 15);
if (t != nullptr)
cout << "Nasli " << t->key << endl;
else
cout << "Nenasli" << endl;
cout << "O.K." << endl;
}
{{strom-nakresli1.png}}
{{strom-nakresli2.png}}
writeHtml ("output1.html", root);
remove (root, 10);
writeHtml ("output2.html", root);
void writeNode (ofstream & f, Item * p, int x, int y, int sx, int sy)
{
if (p != nullptr)
{
f << " var v" << p->key << " = graph.insertVertex (parent, null, '" << p->key << "', "
<< x << ", " << y << ", 80, 30);" << endl;
if (p->left != nullptr)
{
writeNode (f, p->left, x-sx, y+sy, sx/2, sy);
f << " graph.insertEdge (parent, null, '', v" << p->key << ", v" << p->left->key << ");" << endl;
}
if (p->right != nullptr)
{
writeNode (f, p->right, x+sx, y+sy, sx/2, sy);
f << " graph.insertEdge (parent, null, '', v" << p->key << ", v" << p->right->key << ");" << endl;
}
}
}
void writeHtml (string fileName, Item * p)
{
ofstream f (fileName);
f << "" << endl;
/* ... */
f << "" << endl;
/* ... */
f << "" << endl;
/* ... */
f << "" << endl;
f.close ();
string cmd = "\"C:/Program Files/Mozilla Firefox/firefox\" " + fileName;
system (cmd.c_str());
}
Část souboru output1.html
var v10 = graph.insertVertex (parent, null, '10', 400, 0, 80, 30);
var v5 = graph.insertVertex (parent, null, '5', 200, 80, 80, 30);
var v3 = graph.insertVertex (parent, null, '3', 100, 160, 80, 30);
var v4 = graph.insertVertex (parent, null, '4', 150, 240, 80, 30);
graph.insertEdge (parent, null, '', v3, v4);
graph.insertEdge (parent, null, '', v5, v3);
var v7 = graph.insertVertex (parent, null, '7', 300, 160, 80, 30);
var v9 = graph.insertVertex (parent, null, '9', 350, 240, 80, 30);
var v8 = graph.insertVertex (parent, null, '8', 325, 320, 80, 30);
graph.insertEdge (parent, null, '', v9, v8);
graph.insertEdge (parent, null, '', v7, v9);
graph.insertEdge (parent, null, '', v5, v7);
graph.insertEdge (parent, null, '', v10, v5);
var v12 = graph.insertVertex (parent, null, '12', 600, 80, 80, 30);
graph.insertEdge (parent, null, '', v10, v12);