Skip to content

Commit 4db9db5

Browse files
committed
_left_rotate() in SBBT
1 parent 57ba98e commit 4db9db5

File tree

2 files changed

+45
-11
lines changed

2 files changed

+45
-11
lines changed

pydatastructs/trees/_backend/cpp/SelfBalancingBinaryTree.hpp

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ static PyObject* SelfBalancingBinaryTree__right_rotate(SelfBalancingBinaryTree*
8888
PyObject* k = PyObject_GetItem(args, PyOne);
8989
BinaryTree* bt = self->bst->binary_tree;
9090
PyObject* y = reinterpret_cast<TreeNode*>(bt->tree->_one_dimensional_array->_data[PyLong_AsLong(k)])->right;
91-
if (y!=Py_None) {
91+
if (y != Py_None) {
9292
reinterpret_cast<TreeNode*>(bt->tree->_one_dimensional_array->_data[PyLong_AsLong(y)])->parent = j;
9393
}
9494
reinterpret_cast<TreeNode*>(bt->tree->_one_dimensional_array->_data[PyLong_AsLong(j)])->left = y;
@@ -110,6 +110,33 @@ static PyObject* SelfBalancingBinaryTree__right_rotate(SelfBalancingBinaryTree*
110110
Py_RETURN_NONE;
111111
}
112112

113+
static PyObject* SelfBalancingBinaryTree__left_rotate(SelfBalancingBinaryTree* self, PyObject *args) {
114+
PyObject* j = PyObject_GetItem(args, PyZero);
115+
PyObject* k = PyObject_GetItem(args, PyOne);
116+
BinaryTree* bt = self->bst->binary_tree;
117+
PyObject* y = reinterpret_cast<TreeNode*>(bt->tree->_one_dimensional_array->_data[PyLong_AsLong(k)])->left;
118+
if (y != Py_None) {
119+
reinterpret_cast<TreeNode*>(bt->tree->_one_dimensional_array->_data[PyLong_AsLong(y)])->parent = j;
120+
}
121+
reinterpret_cast<TreeNode*>(bt->tree->_one_dimensional_array->_data[PyLong_AsLong(j)])->right = y;
122+
reinterpret_cast<TreeNode*>(bt->tree->_one_dimensional_array->_data[PyLong_AsLong(k)])->parent = reinterpret_cast<TreeNode*>(bt->tree->_one_dimensional_array->_data[PyLong_AsLong(j)])->parent;
123+
if (reinterpret_cast<TreeNode*>(bt->tree->_one_dimensional_array->_data[PyLong_AsLong(k)])->parent != Py_None) {
124+
if (reinterpret_cast<TreeNode*>(bt->tree->_one_dimensional_array->_data[PyLong_AsLong(reinterpret_cast<TreeNode*>(bt->tree->_one_dimensional_array->_data[PyLong_AsLong(k)])->parent)])->left == j) {
125+
reinterpret_cast<TreeNode*>(bt->tree->_one_dimensional_array->_data[PyLong_AsLong(reinterpret_cast<TreeNode*>(bt->tree->_one_dimensional_array->_data[PyLong_AsLong(k)])->parent)])->left = k;
126+
}
127+
else {
128+
reinterpret_cast<TreeNode*>(bt->tree->_one_dimensional_array->_data[PyLong_AsLong(reinterpret_cast<TreeNode*>(bt->tree->_one_dimensional_array->_data[PyLong_AsLong(k)])->parent)])->right = k;
129+
}
130+
}
131+
reinterpret_cast<TreeNode*>(bt->tree->_one_dimensional_array->_data[PyLong_AsLong(j)])->parent = k;
132+
reinterpret_cast<TreeNode*>(bt->tree->_one_dimensional_array->_data[PyLong_AsLong(k)])->left = j;
133+
PyObject* kp = reinterpret_cast<TreeNode*>(bt->tree->_one_dimensional_array->_data[PyLong_AsLong(k)])->parent;
134+
if (kp == Py_None) {
135+
bt->root_idx = k;
136+
}
137+
Py_RETURN_NONE;
138+
}
139+
113140
static struct PyMethodDef SelfBalancingBinaryTree_PyMethodDef[] = {
114141
{"insert", (PyCFunction) SelfBalancingBinaryTree_insert, METH_VARARGS | METH_KEYWORDS, NULL},
115142
{"delete", (PyCFunction) SelfBalancingBinaryTree_delete, METH_VARARGS | METH_KEYWORDS, NULL},
@@ -123,6 +150,7 @@ static struct PyMethodDef SelfBalancingBinaryTree_PyMethodDef[] = {
123150
{"rank", (PyCFunction) SelfBalancingBinaryTree_rank, METH_VARARGS, NULL},
124151
{"select", (PyCFunction) SelfBalancingBinaryTree_select, METH_VARARGS, NULL},
125152
{"_right_rotate", (PyCFunction) SelfBalancingBinaryTree__right_rotate, METH_VARARGS, NULL},
153+
{"_left_rotate", (PyCFunction) SelfBalancingBinaryTree__left_rotate, METH_VARARGS, NULL},
126154
{NULL}
127155
};
128156

pydatastructs/trees/tests/test_binary_trees.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -436,11 +436,11 @@ def test_Treap():
436436
assert tree.search(2) == 1
437437
assert tree.delete(1) is None
438438

439-
def test_SelfBalancingBinaryTree():
439+
def _test_SelfBalancingBinaryTree(backend):
440440
"""
441441
https://github.com/codezonediitj/pydatastructs/issues/234
442442
"""
443-
tree = SelfBalancingBinaryTree(backend=Backend.CPP)
443+
tree = SelfBalancingBinaryTree(backend=backend)
444444
tree.insert(5, 5)
445445
tree.insert(5.5, 5.5)
446446
tree.insert(4.5, 4.5)
@@ -456,20 +456,26 @@ def test_SelfBalancingBinaryTree():
456456
assert tree.tree[2].right != 3
457457
assert tree.tree[tree.tree[5].parent].right == 5
458458

459-
trav = BinaryTreeTraversal(tree, backend=Backend.CPP)
459+
trav = BinaryTreeTraversal(tree, backend=backend)
460460
in_order = trav.depth_first_search(order='in_order')
461461
pre_order = trav.depth_first_search(order='pre_order')
462462
assert [node.key for node in in_order] == [4.4, 4.5, 4.55, 4.6, 4.65, 5, 5.5]
463463
assert [node.key for node in pre_order] == [5, 4.5, 4.4, 4.55, 4.6, 4.65, 5.5]
464464

465465
assert tree.tree[tree.tree[3].parent].right == 3
466-
# tree._left_rotate(5, 3)
467-
# assert str(tree) == original_tree
468-
# tree.insert(4.54, 4.54)
469-
# tree.insert(4.56, 4.56)
470-
# tree._left_rotate(5, 8)
471-
# assert tree.tree[tree.tree[8].parent].left == 8
472-
# test_SelfBalancingBinaryTree()
466+
tree._left_rotate(5, 3)
467+
assert str(tree) == original_tree
468+
tree.insert(4.54, 4.54)
469+
tree.insert(4.56, 4.56)
470+
tree._left_rotate(5, 8)
471+
assert tree.tree[tree.tree[8].parent].left == 8
472+
473+
def test_SelfBalancingBinaryTree():
474+
_test_SelfBalancingBinaryTree(Backend.PYTHON)
475+
476+
def test_cpp_SelfBalancingBinaryTree():
477+
_test_SelfBalancingBinaryTree(Backend.CPP)
478+
473479
def test_SplayTree():
474480
t = SplayTree(100, 100)
475481
t.insert(50, 50)

0 commit comments

Comments
 (0)