Do not worry, I do not copy paste code, I judge it and get inspired!
This code - I have not run it - seems to work, but shouldn't we free what we allocated?
Here is the code with the delete operations. I think it's ok, if not let me know!
Of course, since we are in an OOP environment, this can be modified more. :)Code:#include <iostream>
#include <vector>
typedef std::vector<int> VECTOR;
VECTOR nullVector;
class Node {
public:
virtual Node* getLeft() = 0;
virtual Node* getRight() = 0;
virtual void setLeft(Node* n) = 0;
virtual void setRight(Node* n) = 0;
virtual VECTOR& vec() = 0;
virtual void print() = 0;
virtual void freeTree() = 0;
};
class Inner : public Node {
Node* pleft;
Node* pright;
public:
Inner() : pleft(0), pright(0) { }
Node* getLeft() { return pleft; }
Node* getRight() { return pright; }
void setLeft(Node* n) { pleft = n; }
void setRight(Node* n) { pright = n; }
VECTOR& vec() { return nullVector; } // needs to return something
void print();
void freeTree() {
if (getLeft()) getLeft()->freeTree();
if (getRight()) getRight()->freeTree();
delete this;
}
};
void Inner::print() {
std::cout << "Inner\n";
if (getLeft()) getLeft()->print();
if (getRight()) getRight()->print();
}
class Leaf : public Node {
VECTOR v;
public:
Node* getLeft() { return 0; }
Node* getRight() { return 0; }
void setLeft(Node* n) { } // unused parameter warning
void setRight(Node* n) { } // ditto
VECTOR& vec() { return v; }
void print();
void freeTree() {
delete this;
}
};
void Leaf::print() {
for (size_t i = 0; i < v.size(); i++)
std::cout << v[i] << ' ';
std::cout << '\n';
}
int main() {
Node* root = new Inner;
root->setLeft(new Inner);
root->setRight(new Inner);
Node* node = root->getLeft();
node->setLeft(new Leaf);
node->setRight(new Leaf);
node->getLeft()->vec().push_back(1);
node->getLeft()->vec().push_back(2);
node->getLeft()->vec().push_back(3);
node->getRight()->vec().push_back(4);
node->getRight()->vec().push_back(5);
node->getRight()->vec().push_back(6);
node = root->getRight();
node->setLeft(new Leaf);
node->setRight(new Leaf);
node->getLeft()->vec().push_back(7);
node->getLeft()->vec().push_back(8);
node->getLeft()->vec().push_back(9);
node->getRight()->vec().push_back(10);
node->getRight()->vec().push_back(11);
node->getRight()->vec().push_back(12);
root->print();
root->freeTree();
return 0;
}
Thanks again Canada guy :D