1 struct Node {
2 int data;
3 Node* left;
4 Node* right;
5 Node(int d) : data(d),left(0),right(0) {
6 }
7 };
8
9 class Tree {
10 private:
11 Node* root;
12 int count;
13 int recursiveHeight(Node* subTree);
14 void recursivePreOrder(Node* subTree);
15 void recursiveInsert(const int& value, Node*& subTree);
16 void postOrderRemove(Node*& subTree);
17 public:
18 Tree();
19 ~Tree();
20 int height() const;
21 void insert(const int& value);
22 void preOrder();
23 void bfs();
24 void dfs(Node* subTree) const;
25 Node* getRoot() const { return root; }
26 void clear();
27 };
28
29 Tree::Tree()
30 :root(0), count(0){
31
32 }
33
34 Tree::~Tree() {
35 clear();
36 }
37
38 int Tree::recursiveHeight(Node* subTree) {
39 if (subTree == NULL)
40 return 0;
41 int left = recursiveHeight(subTree->left);
42 int right = recursiveHeight(subTree->right);
43 if (left > right) {
44 return left + 1;
45 } else {
46 return right + 1;
47 }
48 }
49
50 void Tree::recursiveInsert(const int& value, Node*& subTree) {
51 if (subTree == NULL) {
52 Node *node = new Node(value);
53 subTree = node;
54 count++;
55 } else {
56 if (recursiveHeight(subTree->left) <= recursiveHeight(subTree->right)) {
57 recursiveInsert(value, subTree->left);
58 } else {
59 recursiveInsert(value, subTree->right);
60 }
61 }
62 }
63
64 void Tree::insert(const int& value) {
65 recursiveInsert(value, root);
66 }
67
68 void Tree::recursivePreOrder(Node* subTree) {
69 if (subTree != NULL) {
70 printf("%d ", subTree->data);
71 recursivePreOrder(subTree->left);
72 recursivePreOrder(subTree->right);
73 }
74 }
75
76 void Tree::preOrder() {
77 recursivePreOrder(root);
78 printf("\n");
79 }
80
81 void Tree::bfs() {
82 queue<Node*> q;
83 if (root != NULL) {
84 q.push(root);
85 while (!q.empty()) {
86 Node *node = q.front();
87 printf("%d ", node->data);
88 if (node->left != NULL) {
89 q.push(node->left);
90 }
91 if (node->right != NULL) {
92 q.push(node->right);
93 }
94 q.pop();
95 }
96 printf("\n");
97 }
98 }
99
100 void Tree::dfs(Node* subTree) const {
101 if (subTree != NULL) {
102 printf("%d ", subTree->data);
103 dfs(subTree->left);
104 dfs(subTree->right);
105 }
106 }
107
108 void Tree::clear() {
109 postOrderRemove(root);
110 }
111
112 void Tree::postOrderRemove(Node*& subTree) {
113 if (subTree != NULL) {
114 postOrderRemove(subTree->left);
115 postOrderRemove(subTree->right);
116 delete subTree;
117 subTree = NULL;
118 count--;
119 }
120 }