Skip to content

Commit 6adf3d2

Browse files
committed
BTT depth_first_search() implemented
1 parent 3c961ae commit 6adf3d2

File tree

2 files changed

+26
-5
lines changed

2 files changed

+26
-5
lines changed

pydatastructs/trees/_backend/cpp/BinaryTreeTraversal.hpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <cstdlib>
88
#include <iostream>
99
#include <stack>
10+
#include <string>
1011
#include "../../../utils/_backend/cpp/utils.hpp"
1112
#include "../../../utils/_backend/cpp/TreeNode.hpp"
1213
#include "../../../linear_data_structures/_backend/cpp/arrays/ArrayForTrees.hpp"
@@ -42,10 +43,10 @@ static PyObject* BinaryTreeTraversal___new__(PyTypeObject* type, PyObject *args,
4243
}
4344

4445
static PyObject* BinaryTreeTraversal__pre_order(BinaryTreeTraversal* self, PyObject *args){
46+
long node = PyLong_AsLong(PyObject_GetItem(args, PyZero));
4547
PyObject* visit = PyList_New(0);
4648
ArrayForTrees* tree = self->tree->tree;
4749
long size = self->tree->size;
48-
long node = PyLong_AsLong(PyObject_GetItem(args, PyZero));
4950
std::stack<long> s;
5051
s.push(node);
5152

@@ -64,8 +65,29 @@ static PyObject* BinaryTreeTraversal__pre_order(BinaryTreeTraversal* self, PyObj
6465
return visit;
6566
}
6667

68+
static PyObject* BinaryTreeTraversal_depth_first_search(BinaryTreeTraversal* self, PyObject *args, PyObject *kwds) {
69+
Py_INCREF(Py_None);
70+
PyObject* node = Py_None;
71+
PyObject* order = PyUnicode_FromString("in_order");
72+
static char* keywords[] = {"node","order", NULL};
73+
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO", keywords, &node, &order)) {
74+
return NULL;
75+
}
76+
if (node == Py_None) {
77+
node = self->tree->root_idx;
78+
}
79+
if (PyUnicode_Compare(order, PyUnicode_FromString("pre_order")) == 0) {
80+
return BinaryTreeTraversal__pre_order(self, Py_BuildValue("(O)", node));
81+
}
82+
else {
83+
PyErr_SetString(PyExc_NotImplementedError, "This traversal is not implemented yet or does not exist. Supported traversals: \"pre_order\"");
84+
return NULL;
85+
}
86+
}
87+
6788
static struct PyMethodDef BinaryTreeTraversal_PyMethodDef[] = {
6889
{"_pre_order", (PyCFunction) BinaryTreeTraversal__pre_order, METH_VARARGS, NULL},
90+
{"depth_first_search", (PyCFunction) BinaryTreeTraversal_depth_first_search, METH_VARARGS | METH_KEYWORDS, NULL},
6991
{NULL}
7092
};
7193

pydatastructs/trees/tests/test_binary_trees.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,11 @@ def test_cpp_BST2():
6060
"(5, 6, 6, 6), (None, 4, 4, None), (None, 7, 7, None), (8, 14, 14, None), "
6161
"(None, 13, 13, None)]")
6262

63+
##### BinaryTreeTraversal _pre_order test #####
6364
from pydatastructs.trees._backend.cpp import _trees
6465
t = _trees.BinaryTreeTraversal(b)
65-
p = t._pre_order(0)
66+
p = t.depth_first_search(order="pre_order")
6667
assert [node.key for node in p] == [8, 3, 1, 6, 4, 7, 10, 14, 13]
67-
# key_arr = [node.key for node in p]
68-
# print(key_arr)
6968

7069
##### _simple_path() test #####
7170
path = b._simple_path(1,0)
@@ -185,7 +184,7 @@ def test_cpp_BST2():
185184
assert b3.lower_bound(-1) == 7
186185
assert b3.lower_bound(20) is None
187186

188-
test_cpp_BST2()
187+
# test_cpp_BST2()
189188

190189
def test_cpp_BST_speed():
191190
BST = BinarySearchTree

0 commit comments

Comments
 (0)