1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
#include <iostream>
using namespace std;
struct Node{
int data;
Node* right;
Node* left;
Node(int n) : data(n), right(nullptr), left(nullptr) {}
};
class Tree{
private:
Node *root;
static Node* searchTree_r(Node *tree, int data) {
if (tree && tree->data != data)
return searchTree_r(data > tree->data ? tree->right : tree->left, data);
return tree;
}
static Node* addNode_r(Node *tree, int data){
if (!tree)
return new Node(data);
if (data > tree->data)
tree->right = addNode_r(tree->right, data);
else
tree->left = addNode_r(tree->left, data);
return tree;
}
static void deleteTree(Node *t) {
if (!t) return;
deleteTree(t->left);
deleteTree(t->right);
delete t;
}
static void print_r(Node *t, ostream& os) {
if (!t) return;
print_r(t->left, os);
cout << t->data << ' ';
print_r(t->right, os);
}
public:
Tree() : root(nullptr) { }
~Tree() { deleteTree(root); }
void addNode(int data) {
root = addNode_r(root, data);
}
Node* searchTree(int data) {
return searchTree_r(root, data);
}
ostream& print(ostream& os) {
print_r(root, os);
return os << '\n';
}
};
ostream& operator<<(ostream& os, Tree& t) { return t.print(os); }
int main() {
Tree p;
for (auto n: {4, 6, 3, 8, 7, 0, 7, 1})
p.addNode(n);
for (auto n: { -1,0,1,2,3,4,5,6,7,8,9,10 }) {
Node* b = p.searchTree(n);
if (!b)
cout << n << " not found\n";
else
cout << "found " << b->data << '\n';
}
cout << p << '\n';
}
|