Skip to content

Commit ff02d10

Browse files
authored
C++ backend for all trees in binary_trees.py file complete (#569)
1 parent 35844a2 commit ff02d10

File tree

8 files changed

+72
-9
lines changed

8 files changed

+72
-9
lines changed

AUTHORS

+1
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ Harsheet <[email protected]>
1010
Pratik Goyal <[email protected]>
1111
Jay Thorat <[email protected]>
1212
Rajveer Singh Bharadwaj <[email protected]>
13+
Kishan Ved <[email protected]>

pydatastructs/trees/_backend/cpp/AVLTree.hpp

+13-3
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ static long AVLTree_left_height(AVLTree* self, PyObject *args) {
5757
BinaryTree* bt = self->sbbt->bst->binary_tree;
5858
return reinterpret_cast<TreeNode*>(bt->tree->_one_dimensional_array->_data[PyLong_AsLong(node->left)])->height;
5959
}
60-
else{
60+
else {
6161
return (-1);
6262
}
6363
}
@@ -68,7 +68,7 @@ static long AVLTree_right_height(AVLTree* self, PyObject *args) {
6868
BinaryTree* bt = self->sbbt->bst->binary_tree;
6969
return reinterpret_cast<TreeNode*>(bt->tree->_one_dimensional_array->_data[PyLong_AsLong(node->right)])->height;
7070
}
71-
else{
71+
else {
7272
return -1;
7373
}
7474
}
@@ -306,6 +306,11 @@ static PyObject* AVLTree_delete(AVLTree* self, PyObject *args, PyObject *kwds) {
306306
Py_RETURN_TRUE;
307307
}
308308

309+
static PyObject* AVLTree_root_idx(AVLTree *self, void *closure) {
310+
return self->sbbt->bst->binary_tree->root_idx;
311+
}
312+
313+
309314
static struct PyMethodDef AVLTree_PyMethodDef[] = {
310315
{"search", (PyCFunction) AVLTree_search, METH_VARARGS | METH_KEYWORDS, NULL},
311316
{"insert", (PyCFunction) AVLTree_insert, METH_VARARGS, NULL},
@@ -321,6 +326,11 @@ static struct PyMethodDef AVLTree_PyMethodDef[] = {
321326
{NULL}
322327
};
323328

329+
static PyGetSetDef AVLTree_GetterSetters[] = {
330+
{"root_idx", (getter) AVLTree_root_idx, NULL, "returns the index of the tree's root", NULL},
331+
{NULL} /* Sentinel */
332+
};
333+
324334
static PyMemberDef AVLTree_PyMemberDef[] = {
325335
{"tree", T_OBJECT_EX, offsetof(AVLTree, tree), 0, "tree"},
326336
{NULL} /* Sentinel */
@@ -356,7 +366,7 @@ static PyTypeObject AVLTreeType = {
356366
/* tp_iternext */ 0,
357367
/* tp_methods */ AVLTree_PyMethodDef,
358368
/* tp_members */ AVLTree_PyMemberDef,
359-
/* tp_getset */ 0,
369+
/* tp_getset */ AVLTree_GetterSetters,
360370
/* tp_base */ &SelfBalancingBinaryTreeType,
361371
/* tp_dict */ 0,
362372
/* tp_descr_get */ 0,

pydatastructs/trees/_backend/cpp/BinarySearchTree.hpp

+11-1
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,11 @@ static PyObject* BinarySearchTree_select(BinarySearchTree* self, PyObject* args)
659659
Py_RETURN_NONE; // dummy return statement, never executed
660660
}
661661

662+
static PyObject* BinarySearchTree_root_idx(BinarySearchTree *self, void *closure) {
663+
return self->binary_tree->root_idx;
664+
}
665+
666+
662667
static struct PyMethodDef BinarySearchTree_PyMethodDef[] = {
663668
{"insert", (PyCFunction) BinarySearchTree_insert, METH_VARARGS | METH_KEYWORDS, NULL},
664669
{"delete", (PyCFunction) BinarySearchTree_delete, METH_VARARGS | METH_KEYWORDS, NULL},
@@ -674,6 +679,11 @@ static struct PyMethodDef BinarySearchTree_PyMethodDef[] = {
674679
{NULL}
675680
};
676681

682+
static PyGetSetDef BinarySearchTree_GetterSetters[] = {
683+
{"root_idx", (getter) BinarySearchTree_root_idx, NULL, "returns the index of the tree's root", NULL},
684+
{NULL} /* Sentinel */
685+
};
686+
677687
static PyMemberDef BinarySearchTree_PyMemberDef[] = {
678688
{"tree", T_OBJECT_EX, offsetof(BinarySearchTree, tree), 0, "tree"},
679689
{NULL} /* Sentinel */
@@ -709,7 +719,7 @@ static PyTypeObject BinarySearchTreeType = {
709719
/* tp_iternext */ 0,
710720
/* tp_methods */ BinarySearchTree_PyMethodDef,
711721
/* tp_members */ BinarySearchTree_PyMemberDef,
712-
/* tp_getset */ 0,
722+
/* tp_getset */ BinarySearchTree_GetterSetters,
713723
/* tp_base */ &BinaryTreeType,
714724
/* tp_dict */ 0,
715725
/* tp_descr_get */ 0,

pydatastructs/trees/_backend/cpp/RedBlackTree.hpp

+10-1
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,10 @@ static PyObject* RedBlackTree_search(RedBlackTree* self, PyObject *args, PyObjec
578578
return BinarySearchTree_search(self->sbbt->bst, args, kwds);
579579
}
580580

581+
static PyObject* RedBlackTree_root_idx(RedBlackTree *self, void *closure) {
582+
return self->sbbt->bst->binary_tree->root_idx;
583+
}
584+
581585

582586
static struct PyMethodDef RedBlackTree_PyMethodDef[] = {
583587
{"insert", (PyCFunction) RedBlackTree_insert, METH_VARARGS, NULL},
@@ -592,6 +596,11 @@ static struct PyMethodDef RedBlackTree_PyMethodDef[] = {
592596
{NULL}
593597
};
594598

599+
static PyGetSetDef RedBlackTree_GetterSetters[] = {
600+
{"root_idx", (getter) RedBlackTree_root_idx, NULL, "returns the index of the tree's root", NULL},
601+
{NULL} /* Sentinel */
602+
};
603+
595604
static PyMemberDef RedBlackTree_PyMemberDef[] = {
596605
{"tree", T_OBJECT_EX, offsetof(RedBlackTree, tree), 0, "tree"},
597606
{NULL} /* Sentinel */
@@ -627,7 +636,7 @@ static PyTypeObject RedBlackTreeType = {
627636
/* tp_iternext */ 0,
628637
/* tp_methods */ RedBlackTree_PyMethodDef,
629638
/* tp_members */ RedBlackTree_PyMemberDef,
630-
/* tp_getset */ 0,
639+
/* tp_getset */ RedBlackTree_GetterSetters,
631640
/* tp_base */ &SelfBalancingBinaryTreeType,
632641
/* tp_dict */ 0,
633642
/* tp_descr_get */ 0,

pydatastructs/trees/_backend/cpp/SelfBalancingBinaryTree.hpp

+11-1
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,11 @@ static PyObject* SelfBalancingBinaryTree__right_left_rotate(SelfBalancingBinaryT
219219
Py_RETURN_NONE;
220220
}
221221

222+
static PyObject* SelfBalancingBinaryTree_root_idx(SelfBalancingBinaryTree *self, void *closure) {
223+
return self->bst->binary_tree->root_idx;
224+
}
225+
226+
222227
static struct PyMethodDef SelfBalancingBinaryTree_PyMethodDef[] = {
223228
{"insert", (PyCFunction) SelfBalancingBinaryTree_insert, METH_VARARGS | METH_KEYWORDS, NULL},
224229
{"delete", (PyCFunction) SelfBalancingBinaryTree_delete, METH_VARARGS | METH_KEYWORDS, NULL},
@@ -238,6 +243,11 @@ static struct PyMethodDef SelfBalancingBinaryTree_PyMethodDef[] = {
238243
{NULL}
239244
};
240245

246+
static PyGetSetDef SelfBalancingBinaryTree_GetterSetters[] = {
247+
{"root_idx", (getter) SelfBalancingBinaryTree_root_idx, NULL, "returns the index of the tree's root", NULL},
248+
{NULL} /* Sentinel */
249+
};
250+
241251
static PyMemberDef SelfBalancingBinaryTree_PyMemberDef[] = {
242252
{"tree", T_OBJECT_EX, offsetof(SelfBalancingBinaryTree, tree), 0, "tree"},
243253
{NULL} /* Sentinel */
@@ -273,7 +283,7 @@ static PyTypeObject SelfBalancingBinaryTreeType = {
273283
/* tp_iternext */ 0,
274284
/* tp_methods */ SelfBalancingBinaryTree_PyMethodDef,
275285
/* tp_members */ SelfBalancingBinaryTree_PyMemberDef,
276-
/* tp_getset */ 0,
286+
/* tp_getset */ SelfBalancingBinaryTree_GetterSetters,
277287
/* tp_base */ &BinarySearchTreeType,
278288
/* tp_dict */ 0,
279289
/* tp_descr_get */ 0,

pydatastructs/trees/_backend/cpp/SplayTree.hpp

+10-1
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,11 @@ static PyObject* SplayTree_split(SplayTree *self, PyObject* args) {
284284
return reinterpret_cast<PyObject*>(other);
285285
}
286286

287+
static PyObject* SplayTree_root_idx(SplayTree *self, void *closure) {
288+
return self->sbbt->bst->binary_tree->root_idx;
289+
}
290+
291+
287292
static struct PyMethodDef SplayTree_PyMethodDef[] = {
288293
{"insert", (PyCFunction) SplayTree_insert, METH_VARARGS, NULL},
289294
{"delete", (PyCFunction) SplayTree_delete, METH_VARARGS, NULL},
@@ -292,6 +297,10 @@ static struct PyMethodDef SplayTree_PyMethodDef[] = {
292297
{NULL}
293298
};
294299

300+
static PyGetSetDef SplayTree_GetterSetters[] = {
301+
{"root_idx", (getter) SplayTree_root_idx, NULL, "returns the index of the tree's root", NULL},
302+
{NULL} /* Sentinel */
303+
};
295304

296305
static PyMemberDef SplayTree_PyMemberDef[] = {
297306
{"tree", T_OBJECT_EX, offsetof(SplayTree, tree), 0, "tree"},
@@ -328,7 +337,7 @@ static PyTypeObject SplayTreeType = {
328337
/* tp_iternext */ 0,
329338
/* tp_methods */ SplayTree_PyMethodDef,
330339
/* tp_members */ SplayTree_PyMemberDef,
331-
/* tp_getset */ 0,
340+
/* tp_getset */ SplayTree_GetterSetters,
332341
/* tp_base */ &SelfBalancingBinaryTreeType,
333342
/* tp_dict */ 0,
334343
/* tp_descr_get */ 0,

pydatastructs/trees/_backend/cpp/Treap.hpp

+10-1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ static PyObject* Treap_insert(Treap *self, PyObject* args) {
6262
return CartesianTree_insert(self->ct, Py_BuildValue("(OOO)", key, priority, data));
6363
}
6464

65+
static PyObject* Treap_root_idx(Treap *self, void *closure) {
66+
return self->ct->sbbt->bst->binary_tree->root_idx;
67+
}
68+
6569

6670
static struct PyMethodDef Treap_PyMethodDef[] = {
6771
{"insert", (PyCFunction) Treap_insert, METH_VARARGS, NULL},
@@ -70,6 +74,11 @@ static struct PyMethodDef Treap_PyMethodDef[] = {
7074
{NULL} /* Sentinel */
7175
};
7276

77+
static PyGetSetDef Treap_GetterSetters[] = {
78+
{"root_idx", (getter) Treap_root_idx, NULL, "returns the index of the tree's root", NULL},
79+
{NULL} /* Sentinel */
80+
};
81+
7382
static PyMemberDef Treap_PyMemberDef[] = {
7483
{"tree", T_OBJECT_EX, offsetof(Treap, tree), 0, "tree"},
7584
{NULL} /* Sentinel */
@@ -105,7 +114,7 @@ static PyTypeObject TreapType = {
105114
/* tp_iternext */ 0,
106115
/* tp_methods */ Treap_PyMethodDef,
107116
/* tp_members */ Treap_PyMemberDef,
108-
/* tp_getset */ 0,
117+
/* tp_getset */ Treap_GetterSetters,
109118
/* tp_base */ &CartesianTreeType,
110119
/* tp_dict */ 0,
111120
/* tp_descr_get */ 0,

pydatastructs/trees/tests/test_binary_trees.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ def _test_BinarySearchTree(backend):
2626
("[(1, 8, 8, 2), (3, 3, 3, 4), (None, 10, 10, 7), (None, 1, 1, None), "
2727
"(5, 6, 6, 6), (None, 4, 4, None), (None, 7, 7, None), (8, 14, 14, None), "
2828
"(None, 13, 13, None)]")
29+
assert b.root_idx == 0
2930

3031
assert b.tree[0].left == 1
3132
assert b.tree[0].key == 8
@@ -171,6 +172,7 @@ def _test_AVLTree(backend):
171172
a.insert('H', 'H')
172173
a.insert('I', 'I')
173174
a.insert('A', 'A')
175+
assert a.root_idx == 1
174176

175177
trav = BinaryTreeTraversal(a, backend=backend)
176178
in_order = trav.depth_first_search(order='in_order')
@@ -465,7 +467,7 @@ def _test_Treap(backend):
465467
tree.insert(3, 3)
466468
tree.insert(4, 4)
467469
tree.insert(5, 5)
468-
print(str(tree))
470+
469471
assert isinstance(tree.tree[0].priority, float)
470472
tree.delete(1)
471473
assert tree.search(1) is None
@@ -497,6 +499,7 @@ def _test_SelfBalancingBinaryTree(backend):
497499
assert tree.tree[3].parent == 5
498500
assert tree.tree[2].right != 3
499501
assert tree.tree[tree.tree[5].parent].right == 5
502+
assert tree.root_idx == 0
500503

501504
trav = BinaryTreeTraversal(tree, backend=backend)
502505
in_order = trav.depth_first_search(order='in_order')
@@ -533,6 +536,7 @@ def _test_SplayTree(backend):
533536
t.insert(20, 20)
534537
t.insert(55, 55)
535538
assert str(t) == "[(None, 100, 100, None), (None, 50, 50, None), (0, 200, 200, None), (None, 40, 40, 1), (5, 30, 30, 3), (None, 20, 20, None), (4, 55, 55, 2)]"
539+
assert t.root_idx == 6
536540

537541
trav = BinaryTreeTraversal(t, backend=backend)
538542
in_order = trav.depth_first_search(order='in_order')
@@ -610,6 +614,7 @@ def _test_RedBlackTree(backend):
610614
tree.insert(17, 17)
611615
tree.insert(6, 6)
612616
assert str(tree) == "[(11, 10, 10, 3), (10, 18, 18, None), (None, 7, 7, None), (None, 15, 15, None), (0, 16, 16, 6), (None, 30, 30, None), (1, 25, 25, 7), (5, 40, 40, 8), (None, 60, 60, None), (None, 2, 2, None), (None, 17, 17, None), (9, 6, 6, 2)]"
617+
assert tree.root_idx == 4
613618

614619
trav = BinaryTreeTraversal(tree, backend=backend)
615620
in_order = trav.depth_first_search(order='in_order')

0 commit comments

Comments
 (0)