Skip to content

Commit c4ecdd0

Browse files
committed
added inorder traversal
1 parent 6ab65fc commit c4ecdd0

File tree

2 files changed

+33
-6
lines changed

2 files changed

+33
-6
lines changed

pydatastructs/trees/_backend/cpp/BinaryTreeTraversal.hpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,29 @@ static PyObject* BinaryTreeTraversal__pre_order(BinaryTreeTraversal* self, PyObj
6464
return visit;
6565
}
6666

67+
static PyObject* BinaryTreeTraversal__in_order(BinaryTreeTraversal* self, PyObject *args){
68+
PyObject* node = PyObject_GetItem(args, PyZero);
69+
PyObject* visit = PyList_New(0);
70+
ArrayForTrees* tree = self->tree->tree;
71+
long size = self->tree->size;
72+
std::stack<PyObject*> s;
73+
74+
while (!s.empty() || node != Py_None) {
75+
if (node != Py_None) {
76+
s.push(node);
77+
node = reinterpret_cast<TreeNode*>(tree->_one_dimensional_array->_data[PyLong_AsLong(node)])->left;
78+
}
79+
else {
80+
node = s.top();
81+
s.pop();
82+
TreeNode* curr_node = reinterpret_cast<TreeNode*>(tree->_one_dimensional_array->_data[PyLong_AsLong(node)]);
83+
PyList_Append(visit, reinterpret_cast<PyObject*>(curr_node));
84+
node = curr_node->right;
85+
}
86+
}
87+
return visit;
88+
}
89+
6790
static PyObject* BinaryTreeTraversal_depth_first_search(BinaryTreeTraversal* self, PyObject *args, PyObject *kwds) {
6891
Py_INCREF(Py_None);
6992
PyObject* node = Py_None;
@@ -78,6 +101,9 @@ static PyObject* BinaryTreeTraversal_depth_first_search(BinaryTreeTraversal* sel
78101
if (PyUnicode_Compare(order, PyUnicode_FromString("pre_order")) == 0) {
79102
return BinaryTreeTraversal__pre_order(self, Py_BuildValue("(O)", node));
80103
}
104+
else if (PyUnicode_Compare(order, PyUnicode_FromString("in_order")) == 0) {
105+
return BinaryTreeTraversal__in_order(self, Py_BuildValue("(O)", node));
106+
}
81107
else {
82108
PyErr_SetString(PyExc_NotImplementedError, "This traversal is not implemented yet or does not exist. Supported traversals: \"pre_order\"");
83109
return NULL;
@@ -86,6 +112,7 @@ static PyObject* BinaryTreeTraversal_depth_first_search(BinaryTreeTraversal* sel
86112

87113
static struct PyMethodDef BinaryTreeTraversal_PyMethodDef[] = {
88114
{"_pre_order", (PyCFunction) BinaryTreeTraversal__pre_order, METH_VARARGS, NULL},
115+
{"_in_order", (PyCFunction) BinaryTreeTraversal__pre_order, METH_VARARGS, NULL},
89116
{"depth_first_search", (PyCFunction) BinaryTreeTraversal_depth_first_search, METH_VARARGS | METH_KEYWORDS, NULL},
90117
{NULL}
91118
};

pydatastructs/trees/tests/test_binary_trees.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ def _test_BinarySearchTree(backend):
2727
"(None, 13, 13, None)]")
2828

2929
trav = BinaryTreeTraversal(b, backend=backend)
30-
# in_order = trav.depth_first_search(order='in_order')
30+
in_order = trav.depth_first_search(order='in_order')
3131
pre_order = trav.depth_first_search(order='pre_order')
32-
# assert [node.key for node in in_order] == [1, 3, 4, 6, 7, 8, 10, 13, 14]
32+
assert [node.key for node in in_order] == [1, 3, 4, 6, 7, 8, 10, 13, 14]
3333
assert [node.key for node in pre_order] == [8, 3, 1, 6, 4, 7, 10, 14, 13]
3434

3535
assert b.search(10) == 2
@@ -42,19 +42,19 @@ def _test_BinarySearchTree(backend):
4242
assert b.search(3) is None
4343
assert b.delete(13) is None
4444

45-
# in_order = trav.depth_first_search(order='in_order')
45+
in_order = trav.depth_first_search(order='in_order')
4646
pre_order = trav.depth_first_search(order='pre_order')
47-
# assert [node.key for node in in_order] == [1, 4, 6, 7, 8, 14]
47+
assert [node.key for node in in_order] == [1, 4, 6, 7, 8, 14]
4848
assert [node.key for node in pre_order] == [8, 4, 1, 6, 7, 14]
4949

5050
b.delete(7)
5151
b.delete(6)
5252
b.delete(1)
5353
b.delete(4)
5454

55-
# in_order = trav.depth_first_search(order='in_order')
55+
in_order = trav.depth_first_search(order='in_order')
5656
pre_order = trav.depth_first_search(order='pre_order')
57-
# assert [node.key for node in in_order] == [8, 14]
57+
assert [node.key for node in in_order] == [8, 14]
5858
assert [node.key for node in pre_order] == [8, 14]
5959

6060
bc = BST(1, 1, backend=backend)

0 commit comments

Comments
 (0)