1
+ // Binary tree
2
+ // Diameter https://www.techiedelight.com/find-diameter-of-a-binary-tree/
3
+
4
+ #include < iostream>
5
+ #include < vector>
6
+ #include < queue>
7
+ #include < climits>
8
+
9
+ enum class TRAVERSAL {inorder, preorder, postorder};
10
+
11
+ class BinaryTree
12
+ {
13
+ private:
14
+ class Node
15
+ {
16
+ public:
17
+ int key;
18
+ Node* left;
19
+ Node* right;
20
+
21
+ Node () : key(0 ), left(nullptr ), right(nullptr ) { }
22
+ Node (int k) : key(k), left(nullptr ), right(nullptr ) { }
23
+ };
24
+
25
+ Node* root;
26
+
27
+ void constructTree (std::vector<int >& keys)
28
+ {
29
+ std::queue<Node*> nodeQueue;
30
+ if (root == nullptr ) {
31
+ root = new Node (keys[0 ]);
32
+ }
33
+ nodeQueue.push (root);
34
+
35
+ int keysIndex = 1 ;
36
+ while (!nodeQueue.empty ()) {
37
+ Node* currentNode = nodeQueue.front ();
38
+ nodeQueue.pop ();
39
+
40
+ if (keysIndex < keys.size () && keys[keysIndex] != INT_MIN) {
41
+ currentNode->left = new Node (keys[keysIndex]);
42
+ nodeQueue.push (currentNode->left );
43
+ }
44
+ keysIndex++;
45
+
46
+ if (keysIndex < keys.size () && keys[keysIndex] != INT_MIN) {
47
+ currentNode->right = new Node (keys[keysIndex]);
48
+ nodeQueue.push (currentNode->right );
49
+ }
50
+ keysIndex++;
51
+ }
52
+ }
53
+
54
+ void traverseTree (Node* node, const TRAVERSAL& order, std::vector<Node*>& traversal)
55
+ {
56
+ if (node == nullptr ) {
57
+ return ;
58
+ }
59
+
60
+ if (order == TRAVERSAL::inorder) {
61
+ traverseTree (node->left , order, traversal);
62
+ traversal.push_back (node);
63
+ traverseTree (node->right , order, traversal);
64
+ } else if (order == TRAVERSAL::postorder) {
65
+ traverseTree (node->left , order, traversal);
66
+ traverseTree (node->right , order, traversal);
67
+ traversal.push_back (node);
68
+ } else {
69
+ traversal.push_back (node);
70
+ traverseTree (node->left , order, traversal);
71
+ traverseTree (node->right , order, traversal);
72
+ }
73
+ }
74
+
75
+ void printTraversal (std::vector<Node*>& traversal)
76
+ {
77
+ for (auto node : traversal) {
78
+ std::cout << node->key << " " ;
79
+ }
80
+ std::cout << " \n " ;
81
+ }
82
+
83
+ int height (Node* node)
84
+ {
85
+ if (node == nullptr ) {
86
+ return 0 ;
87
+ }
88
+
89
+ return 1 + std::max (height (node->left ), height (node->right ));
90
+ }
91
+
92
+ int getDiameter (Node* node, int & diameter)
93
+ {
94
+ if (node == nullptr ) {
95
+ return 0 ;
96
+ }
97
+
98
+ int leftHeight = getDiameter (node->left , diameter);
99
+ int rightHeight = getDiameter (node->right , diameter);
100
+ diameter = std::max (diameter, leftHeight + rightHeight + 1 );
101
+
102
+ return 1 + std::max (leftHeight, rightHeight);
103
+ }
104
+
105
+ public:
106
+ BinaryTree () : root(nullptr ) { }
107
+
108
+ BinaryTree (std::vector<int >& keys) : root(nullptr )
109
+ {
110
+ if (keys.size () == 0 ) {
111
+ return ;
112
+ }
113
+ constructTree (keys);
114
+ }
115
+
116
+ void traverseTree (const TRAVERSAL& order)
117
+ {
118
+ std::vector<Node*> traversal;
119
+ traverseTree (root, order, traversal);
120
+ printTraversal (traversal);
121
+ }
122
+
123
+ int height ()
124
+ {
125
+ return height (root);
126
+ }
127
+
128
+ int diameter ()
129
+ {
130
+ int dia = 0 ;
131
+ getDiameter (root, dia);
132
+ return dia;
133
+ }
134
+ };
135
+
136
+ int main ()
137
+ {
138
+ std::vector<int > keys {1 , 2 , 3 , 4 , 5 , 6 , INT_MIN, 7 , INT_MIN, 8 , 9 , INT_MIN, 10 , 11 };
139
+ BinaryTree tree (keys);
140
+
141
+ std::cout << " Preorder traversal: " ;
142
+ tree.traverseTree (TRAVERSAL::preorder);
143
+ std::cout << " Inorder traversal: " ;
144
+ tree.traverseTree (TRAVERSAL::inorder);
145
+ std::cout << " Postorder traversal: " ;
146
+ tree.traverseTree (TRAVERSAL::postorder);
147
+
148
+ std::cout << " Height of tree: " << tree.height () << " \n " ;
149
+ std::cout << " Diameter of tree: " << tree.diameter () << " \n " ;
150
+ }
0 commit comments