Skip to content

Commit fe9db0a

Browse files
committed
bst implementation and basic test added
1 parent a8fba9f commit fe9db0a

File tree

5 files changed

+148
-16
lines changed

5 files changed

+148
-16
lines changed

Headers/0002_Tree/0001_BinarySearchTree.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@ class BinarySearchTree
1818
private:
1919
Node* _root;
2020
void _InsertNode(Node* node);
21-
Node* _FindNode(Node* node, int value);
21+
Node* _FindNode(int value);
2222
Node* _FindMinimumValueNode(Node* node);
2323
Node* _FindMaximumValueNode(Node* node);
2424
Node* _FindSuccessorNode(Node* node);
2525
Node* _FindPredecessorNode(Node* node);
26+
void _Transplant(Node* nodeU, Node* nodeV);
2627
void _DeleteNode(Node* node);
2728
string _RecursiveInorderTraversal(Node* node);
2829
string _RecursivePreorderTraversal(Node* node);
@@ -32,6 +33,8 @@ class BinarySearchTree
3233
string _MorrisPostorderTraversal(Node* node);
3334
public:
3435
BinarySearchTree();
35-
void CheckBSTresult();
3636
void InsertNode(int value);
37+
void DeleteNode(int value);
38+
string GetRecursiveInorderTravesalResult();
39+
string GetMorrisInorderTraversalResult();
3740
};

SourceCodes/0002_Tree/0001_BinarySearchTree.cc

Lines changed: 122 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,9 @@ void BinarySearchTree::_InsertNode(Node* node)
4848
}
4949
}
5050

51-
Node* BinarySearchTree::_FindNode(Node* node, int value)
51+
Node* BinarySearchTree::_FindNode(int value)
5252
{
53+
Node* node = this->_root;
5354
while (node != nullptr)
5455
{
5556
if (value < node->data)
@@ -64,8 +65,8 @@ Node* BinarySearchTree::_FindNode(Node* node, int value)
6465
{
6566
break;
6667
}
67-
return node;
6868
}
69+
return node;
6970
}
7071

7172
Node* BinarySearchTree::_FindMinimumValueNode(Node* node)
@@ -115,13 +116,131 @@ Node* BinarySearchTree::_FindPredecessorNode(Node* node)
115116
}
116117
}
117118

119+
void BinarySearchTree::_Transplant(Node* nodeU, Node* nodeV)
120+
{
121+
if (nodeU->parent == nullptr)
122+
{
123+
this->_root = nodeV;
124+
}
125+
else if (nodeU == nodeU->parent->left)
126+
{
127+
nodeU->parent->left = nodeV;
128+
}
129+
else
130+
{
131+
nodeU->parent->right = nodeV;
132+
}
133+
134+
if (nodeV != nullptr)
135+
{
136+
nodeV->parent = nodeU->parent;
137+
}
138+
}
139+
118140
void BinarySearchTree::_DeleteNode(Node* node)
119141
{
120-
142+
if (node->left == nullptr)
143+
{
144+
this->_Transplant(node, node->right);
145+
}
146+
else if (node->right == nullptr)
147+
{
148+
this->_Transplant(node, node->left);
149+
}
150+
else
151+
{
152+
Node* nodeY = this->_FindMinimumValueNode(node->right);
153+
if (nodeY->parent != node)
154+
{
155+
this->_Transplant(nodeY, nodeY->right);
156+
nodeY->right = node->right;
157+
nodeY->right->parent = nodeY;
158+
}
159+
this->_Transplant(node, nodeY);
160+
nodeY->left = node->left;
161+
nodeY->left->parent = nodeY;
162+
delete node;
163+
}
164+
}
165+
166+
string BinarySearchTree::_RecursiveInorderTraversal(Node* node)
167+
{
168+
if (node == nullptr)
169+
{
170+
return "";
171+
}
172+
string leftSubTree = this->_RecursiveInorderTraversal(node->left);
173+
string currentNode = to_string(node->data);
174+
string rightSubTree = this->_RecursiveInorderTraversal(node->right);
175+
176+
string result = leftSubTree;
177+
if (!leftSubTree.empty())
178+
{
179+
result += " ";
180+
}
181+
result += currentNode;
182+
if (!rightSubTree.empty())
183+
{
184+
result += " " + rightSubTree;
185+
}
186+
return result;
187+
}
188+
189+
string BinarySearchTree::_MorrisInorderTraversal(Node* node)
190+
{
191+
string result = "";
192+
while (node != nullptr)
193+
{
194+
if (node->left == nullptr)
195+
{
196+
result += to_string(node->data) + " ";
197+
node = node->right;
198+
}
199+
else
200+
{
201+
Node* predecessor = node->left;
202+
while (predecessor->right != nullptr && predecessor->right != node)
203+
{
204+
predecessor = predecessor->right;
205+
}
206+
if (predecessor->right == nullptr)
207+
{
208+
predecessor->right = node;
209+
node = node->left;
210+
}
211+
else
212+
{
213+
predecessor->right = nullptr;
214+
result += to_string(node->data) + " ";
215+
node = node->right;
216+
}
217+
}
218+
}
219+
if (!result.empty())
220+
{
221+
result.pop_back();
222+
}
223+
return result;
121224
}
122225

123226
void BinarySearchTree::InsertNode(int value)
124227
{
125228
Node* node = new Node(value, nullptr, nullptr, nullptr);
126229
this->_InsertNode(node);
230+
}
231+
232+
void BinarySearchTree::DeleteNode(int value)
233+
{
234+
Node* node = this->_FindNode(value);
235+
this->_DeleteNode(node);
236+
}
237+
238+
string BinarySearchTree::GetRecursiveInorderTravesalResult()
239+
{
240+
return this->_RecursiveInorderTraversal(this->_root);
241+
}
242+
243+
string BinarySearchTree::GetMorrisInorderTraversalResult()
244+
{
245+
return this->_MorrisInorderTraversal(this->_root);
127246
}

SourceCodes/0002_Tree/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ set(0002TREE_SOURCES
44
)
55

66
# Create a library target
7-
add_library(0002Tree ${0002TREE_SOURCES})
7+
add_library(0002TREE ${0002TREE_SOURCES})
Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
1-
#include<gtest/gtest.h>
1+
#include <gtest/gtest.h>
22
#include<string>
33
#include "../Headers/0002_Tree/0001_BinarySearchTree.h"
44

5+
// Demonstrate some basic assertions.
56
namespace BinarySearchTreeTest
67
{
7-
TEST(BSTTesting, ShowBSTResultTest)
8-
{
9-
ASSERT_EQ(1, 1);
10-
}
8+
TEST(BSTTesting, ShowBSTResultTest)
9+
{
10+
BinarySearchTree bst;
11+
bst.InsertNode(50);
12+
bst.InsertNode(30);
13+
bst.InsertNode(60);
14+
15+
16+
string actualResult = bst.GetRecursiveInorderTravesalResult();
17+
string expectedResult = "30 50 60";
18+
19+
EXPECT_EQ(actualResult, expectedResult);
20+
}
1121
}

Tests/0002_Tree/CMakeLists.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,19 @@ FetchContent_MakeAvailable(googletest)
1111
enable_testing()
1212

1313
add_executable(
14-
0002_Tree_Tests
14+
0002TreeTests
1515
0001_BinarySearchTreeTest.cc)
1616

1717
target_link_libraries(
18-
0002_Tree_Tests
18+
0002TreeTests
1919
GTest::gtest_main
2020
)
2121

2222
target_link_libraries(
23-
0002_Tree_Tests
24-
0001Basics
23+
0002TreeTests
24+
0002TREE
2525
)
2626

2727

2828
include(GoogleTest)
29-
gtest_discover_tests(0002_Tree_Tests)
29+
gtest_discover_tests(0002TreeTests)

0 commit comments

Comments
 (0)