Skip to content

Commit 160480e

Browse files
committed
Add traversal, height and diameter of binary tree
1 parent 0123734 commit 160480e

File tree

2 files changed

+154
-0
lines changed

2 files changed

+154
-0
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,10 @@ Princeton Algorithms [Part 1](https://www.coursera.org/learn/algorithms-part1/)
106106
* Max Queue [Java](problems/priority-queue/MaxQueue.java)
107107
* Min Queue [Java](problems/priority-queue/MinQueue.java)
108108

109+
## Binary Tree
110+
* Binary tree
111+
* Recursive Preorder, inorder, postorder, height, diameter [C++](problems/binary-tree/BasicTree.cpp)
112+
109113
## Symbol table and Search Trees
110114
* Binary Search Tree [Java](problems/symbol-table/BST.java)
111115
* Interval Search Tree [Java](problems/symbol-table/IntervalST.java)

problems/binary-tree/BasicTree.cpp

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
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

Comments
 (0)