Skip to content

Commit 8026a90

Browse files
committed
Added breadth first search in C++ backend and its tests
1 parent 83c74dc commit 8026a90

File tree

2 files changed

+45
-7
lines changed

2 files changed

+45
-7
lines changed

pydatastructs/trees/_backend/cpp/BinaryTreeTraversal.hpp

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <structmember.h>
77
#include <cstdlib>
88
#include <stack>
9+
#include <queue>
910
#include <string>
1011
#include "../../../utils/_backend/cpp/utils.hpp"
1112
#include "../../../utils/_backend/cpp/TreeNode.hpp"
@@ -158,7 +159,44 @@ static PyObject* BinaryTreeTraversal_depth_first_search(BinaryTreeTraversal* sel
158159
return BinaryTreeTraversal__post_order(self, Py_BuildValue("(O)", node));
159160
}
160161
else {
161-
PyErr_SetString(PyExc_NotImplementedError, "This traversal is not implemented yet or does not exist. Supported traversals: \"pre_order\", \"in_order\", \"out_order\"");
162+
PyErr_SetString(PyExc_NotImplementedError, "This traversal is not implemented yet or does not exist. Supported traversals: \"pre_order\", \"in_order\", \"out_order\", , \"post_order\"");
163+
return NULL;
164+
}
165+
}
166+
167+
static PyObject* BinaryTreeTraversal_breadth_first_search(BinaryTreeTraversal* self, PyObject *args, PyObject *kwds) {
168+
Py_INCREF(Py_None);
169+
PyObject* node = Py_None;
170+
PyObject* strategy = PyUnicode_FromString("queue");
171+
static char* keywords[] = {"node","strategy", NULL};
172+
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO", keywords, &node, &strategy)) {
173+
return NULL;
174+
}
175+
if (PyUnicode_Compare(strategy, PyUnicode_FromString("queue")) == 0) {
176+
if (node == Py_None) {
177+
node = self->tree->root_idx;
178+
}
179+
std::queue<PyObject*> q;
180+
PyObject* visit = PyList_New(0);
181+
ArrayForTrees* tree = self->tree->tree;
182+
q.push(node);
183+
while (q.size() > 0) {
184+
node = q.front();
185+
q.pop();
186+
TreeNode* curr_node = reinterpret_cast<TreeNode*>(tree->_one_dimensional_array->_data[PyLong_AsLong(node)]);
187+
PyList_Append(visit, reinterpret_cast<PyObject*>(curr_node));
188+
if (curr_node->left != Py_None) {
189+
q.push(curr_node->left);
190+
}
191+
if (curr_node->right != Py_None) {
192+
q.push(curr_node->right);
193+
}
194+
}
195+
196+
return visit;
197+
}
198+
else {
199+
PyErr_SetString(PyExc_NotImplementedError, "This strategy has not been implemented yet.");
162200
return NULL;
163201
}
164202
}
@@ -169,6 +207,7 @@ static struct PyMethodDef BinaryTreeTraversal_PyMethodDef[] = {
169207
{"_out_order", (PyCFunction) BinaryTreeTraversal__out_order, METH_VARARGS, NULL},
170208
{"_post_order", (PyCFunction) BinaryTreeTraversal__post_order, METH_VARARGS, NULL},
171209
{"depth_first_search", (PyCFunction) BinaryTreeTraversal_depth_first_search, METH_VARARGS | METH_KEYWORDS, NULL},
210+
{"breadth_first_search", (PyCFunction) BinaryTreeTraversal_breadth_first_search, METH_VARARGS | METH_KEYWORDS, NULL},
172211
{NULL}
173212
};
174213

pydatastructs/trees/tests/test_binary_trees.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -140,13 +140,12 @@ def _test_BinaryTreeTraversal(backend):
140140
post = trav.depth_first_search(order='post_order')
141141
assert [node.key for node in post] == ['A', 'C', 'E', 'D', 'B', 'H', 'I', 'G', 'F']
142142

143-
if(backend==Backend.PYTHON): # These are yet to be implemented in the C++ backend
144-
bfs = trav.breadth_first_search()
145-
assert [node.key for node in bfs] == ['F', 'B', 'G', 'A', 'D', 'I', 'C', 'E', 'H']
143+
bfs = trav.breadth_first_search()
144+
assert [node.key for node in bfs] == ['F', 'B', 'G', 'A', 'D', 'I', 'C', 'E', 'H']
146145

147-
assert raises(NotImplementedError, lambda: trav.breadth_first_search(strategy='iddfs'))
148-
assert raises(NotImplementedError, lambda: trav.depth_first_search(order='in_out_order'))
149-
assert raises(TypeError, lambda: BTT(1))
146+
assert raises(NotImplementedError, lambda: trav.breadth_first_search(strategy='iddfs'))
147+
assert raises(NotImplementedError, lambda: trav.depth_first_search(order='in_out_order'))
148+
assert raises(TypeError, lambda: BTT(1))
150149

151150
def test_BinaryTreeTraversal():
152151
_test_BinaryTreeTraversal(Backend.PYTHON)

0 commit comments

Comments
 (0)