Skip to content

Commit 5e6ce32

Browse files
authored
Create main.cpp
1 parent c289dce commit 5e6ce32

File tree

1 file changed

+199
-0
lines changed
  • 17 - Binary Tree Data Structure Problems/01 - Example

1 file changed

+199
-0
lines changed
Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
#include <iostream>
2+
using namespace std;
3+
#include <queue>
4+
#include <stack>
5+
6+
class Node{
7+
public:
8+
int data;
9+
Node* left;
10+
Node* right;
11+
12+
Node(int data){
13+
this -> data = data;
14+
this -> left = NULL;
15+
this -> right = NULL;
16+
}
17+
};
18+
19+
Node* buildTree(Node* root){
20+
cout << "Enter the data : " << endl;
21+
int data;
22+
cin >> data;
23+
root = new Node(data);
24+
25+
if(data == -1) return NULL;
26+
27+
cout << "Enter data for inserting in the left of " << data << endl;
28+
root->left = buildTree(root->left);
29+
30+
cout << "Enter data for inserting in the right of "<< data << endl;
31+
root->right = buildTree(root->right);
32+
33+
return root;
34+
}
35+
36+
void levelOrderTraversal(Node* root){
37+
queue<Node*> q;
38+
q.push(root);
39+
q.push(NULL); // Separator
40+
41+
while(!q.empty()){
42+
Node* temp = q.front();
43+
q.pop();
44+
45+
if(temp == NULL){
46+
// previous level completed
47+
cout << endl;
48+
if(!q.empty()){
49+
// Queue has still some child nodes
50+
q.push(NULL);
51+
}
52+
}else{
53+
cout << temp -> data << " ";
54+
if(temp -> left) q.push(temp -> left);
55+
if(temp -> right) q.push(temp -> right);
56+
}
57+
}
58+
}
59+
60+
void reverseLevelOrderTraversal(Node* root) {
61+
if (root == NULL) return;
62+
63+
queue<Node*> q;
64+
stack<Node*> st;
65+
66+
// Push the root to the queue and a NULL to mark the end of the level
67+
q.push(root);
68+
q.push(NULL); // NULL acts as a level separator
69+
70+
while (!q.empty()) {
71+
Node* temp = q.front();
72+
q.pop();
73+
74+
if (temp == NULL) {
75+
// End of current level
76+
st.push(NULL); // Push NULL to the stack to mark level boundary
77+
78+
if (!q.empty()) {
79+
q.push(NULL); // Add separator for the next level
80+
}
81+
} else {
82+
// Push the node data into the stack
83+
st.push(temp);
84+
85+
// Enqueue right child first, then left child to maintain reverse level order
86+
if (temp->right) q.push(temp->right);
87+
if (temp->left) q.push(temp->left);
88+
}
89+
}
90+
91+
// Print nodes from the stack in reverse level order with levels separated
92+
while (!st.empty()) {
93+
Node* node = st.top();
94+
st.pop();
95+
96+
if (node == NULL) {
97+
cout << endl; // Newline after each level
98+
} else {
99+
cout << node->data << " ";
100+
}
101+
}
102+
cout << endl;
103+
}
104+
105+
void inOrderTraversal(Node* root){
106+
if(root == NULL) return;
107+
108+
inOrderTraversal(root->left);
109+
cout<< root -> data << " ";
110+
inOrderTraversal(root->right);
111+
}
112+
113+
void preOrderTraversal(Node* root){
114+
if(root == NULL) return;
115+
116+
cout<< root -> data << " ";
117+
preOrderTraversal(root->left);
118+
preOrderTraversal(root->right);
119+
}
120+
121+
void postOrderTraversal(Node* root){
122+
if(root == NULL) return;
123+
124+
postOrderTraversal(root->left);
125+
postOrderTraversal(root->right);
126+
cout << root -> data << " ";
127+
}
128+
129+
void buildFromLevelOrder(Node* &root){
130+
queue<Node *> q;
131+
cout << "Enter data for root " << endl;
132+
int data;
133+
cin >> data ;
134+
root = new Node(data);
135+
q.push(root);
136+
137+
while(!q.empty()){
138+
Node* temp = q.front();
139+
q.pop();
140+
141+
cout << "Enter left Node for : " << temp -> data <<endl;
142+
int leftData;
143+
cin>> leftData;
144+
145+
if(leftData != -1){
146+
temp -> left = new Node(leftData);
147+
q.push(temp->left);
148+
}
149+
150+
cout << "Enter right Node for : " << root -> data <<endl;
151+
int rightData;
152+
cin>> rightData;
153+
154+
if(rightData != -1){
155+
temp -> right = new Node(rightData);
156+
q.push(temp->right);
157+
}
158+
}
159+
}
160+
161+
int main() {
162+
Node* root = NULL;
163+
164+
// Creating buildTree
165+
root = buildTree(root);
166+
167+
// // data : 1 3 7 -1 -1 11 -1 -1 5 17 -1 -1 -1
168+
169+
// // level order Traversal
170+
// cout << "Printing the level order traversal output " <<endl;
171+
// levelOrderTraversal(root);
172+
173+
// Reverse Level Order Traversal
174+
cout << "Printing the reverse order traversal output " << endl;
175+
reverseLevelOrderTraversal(root);
176+
177+
// cout << "Inorder Taversal is : ";
178+
// inOrderTraversal(root);
179+
180+
// cout << endl;
181+
182+
// cout << "Preorder Traversal is : ";
183+
// preOrderTraversal(root);
184+
185+
// cout << endl;
186+
187+
// cout << "Postorder Traversal is : ";
188+
// postOrderTraversal(root);
189+
190+
// 1 3 5 7 11 17 -1 -1 -1 -1 -1 -1 -1
191+
// Create from level order
192+
// buildFromLevelOrder(root);
193+
194+
// // // level order
195+
// cout << "Printing the level order traversal output " <<endl;
196+
// levelOrderTraversal(root);
197+
198+
return 0;
199+
}

0 commit comments

Comments
 (0)