Skip to content

Commit 70f4f1d

Browse files
authored
Create remove-levels.cpp
1 parent 6d211e6 commit 70f4f1d

File tree

1 file changed

+186
-0
lines changed

1 file changed

+186
-0
lines changed

algorithms/other/remove-levels.cpp

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
/*
2+
Passed a tree and vector with numbers:
3+
4+
1. Print the first index of level, which spelled left to right,
5+
is equal to the passed vector. -1 if no such level exists.
6+
7+
2. Remove all such levels from the tree.
8+
*/
9+
#include <iostream>
10+
#include <vector>
11+
#include <set>
12+
13+
struct TreeNode
14+
{
15+
int data;
16+
std::vector<TreeNode*> nodes;
17+
18+
void absorbeChildren()
19+
{
20+
unsigned size = nodes.size();
21+
22+
for(size_t i = 0; i < size; i++)
23+
{
24+
nodes.insert(nodes.end(),
25+
nodes[i]->nodes.begin(),
26+
nodes[i]->nodes.end());
27+
28+
delete nodes[i];
29+
}
30+
31+
nodes.erase(nodes.begin(), nodes.begin() + size);
32+
}
33+
};
34+
35+
using level_t = std::vector<int>;
36+
using levelsContainer = std::vector<level_t>;
37+
38+
void collectLevels(const TreeNode* root,
39+
levelsContainer& levels,
40+
unsigned level = 0)
41+
{
42+
if(!root) return;
43+
44+
if(levels.size() <= level)
45+
levels.emplace_back();
46+
47+
levels[level].push_back(root->data);
48+
49+
for(const TreeNode* node : root->nodes)
50+
collectLevels(node, levels, level + 1);
51+
}
52+
53+
bool equalLevels(const level_t& left, const level_t& right)
54+
{
55+
if(left.size() != right.size())
56+
return false;
57+
58+
for (size_t i = 0; i < left.size(); i++)
59+
{
60+
if(left[i] != right[i])
61+
return false;
62+
}
63+
return true;
64+
}
65+
66+
int findLevel(const TreeNode* root, const std::vector<int>& numbers)
67+
{
68+
levelsContainer levels;
69+
collectLevels(root, levels);
70+
71+
for(size_t i = 0; i < levels.size(); i++)
72+
{
73+
if(equalLevels(levels[i], numbers))
74+
return i;
75+
}
76+
return -1;
77+
}
78+
79+
void removeAllLevelsRec(TreeNode* root,
80+
const std::set<int>& levels,
81+
unsigned level = 0)
82+
{
83+
if(!root) return;
84+
85+
while(levels.find(level + 1) != levels.end())
86+
{
87+
root->absorbeChildren();
88+
level += 1;
89+
}
90+
91+
for(TreeNode* child : root->nodes)
92+
removeAllLevelsRec(child, levels, level + 1);
93+
}
94+
95+
void removeAllLevels(TreeNode* root, const std::vector<int>& numbers)
96+
{
97+
levelsContainer levels;
98+
collectLevels(root, levels);
99+
std::set<int> remove;
100+
101+
for(int i = 1; i < levels.size(); i++)
102+
{
103+
if(equalLevels(numbers, levels[i]))
104+
remove.insert(i);
105+
}
106+
107+
removeAllLevelsRec(root, remove);
108+
}
109+
110+
void printLevels(const levelsContainer& container)
111+
{
112+
for(const auto& level : container)
113+
{
114+
for(int x : level)
115+
std::cout << x << ' ';
116+
117+
std::cout << std::endl;
118+
}
119+
}
120+
121+
TreeNode* create(int data, std::initializer_list<TreeNode*> children = {})
122+
{
123+
TreeNode* n = new TreeNode;
124+
n->data = data;
125+
126+
for(TreeNode* c : children)
127+
n->nodes.push_back(c);
128+
129+
return n;
130+
}
131+
132+
void runExample(TreeNode* example, const std::vector<int>& numbers)
133+
{
134+
removeAllLevels(example, numbers);
135+
levelsContainer l;
136+
collectLevels(example, l);
137+
printLevels(l);
138+
std::cout << std::endl;
139+
}
140+
141+
void free(TreeNode* root)
142+
{
143+
if(!root) return;
144+
145+
for(TreeNode* c : root->nodes)
146+
free(c);
147+
148+
delete root;
149+
}
150+
151+
int main()
152+
{
153+
TreeNode* example1 = create(3,
154+
{
155+
create(4,
156+
{
157+
create(1, { create(9), create(5), create(6) }),
158+
create(2, { create(2) }),
159+
create(8, { create(3), create(7) })
160+
}),
161+
create(7, {create(6, {create(9), create(2)})})
162+
}
163+
);
164+
165+
runExample(example1, {1, 2, 8, 6});
166+
167+
free(example1);
168+
169+
TreeNode* example2 = create(1,
170+
{
171+
create(2,
172+
{
173+
create(2, {create(3), create(4)}),
174+
}
175+
),
176+
create(2,
177+
{
178+
create(2, {create(5), create(6), create(7, { create(8) })}),
179+
}
180+
)
181+
}
182+
);
183+
184+
runExample(example2, {2, 2});
185+
free(example2);
186+
}

0 commit comments

Comments
 (0)